C#Try / Catch / Finally

时间:2013-12-04 14:33:40

标签: c# coding-style try-catch standards

我在大多数情况下都被教导要始终从我的代码中删除try / catch / finally块。这背后的原因总是对我有意义(如果你的应用程序以它应该的方式工作,你不需要防止错误),但同时有很多东西可能导致错误,而不是由于差编码;服务器打嗝,图形似乎永远不会失败,因为没有明显的原因失败,等等。我也被告知这些块可以降低性能,当我使用它时没有我个人注意到,但我想这可能是案件。基本上我得到的是;尝试/捕获/最后一个糟糕的整体想法或在某些情况下好的另一个好,如果过度使用不良代码以保持应用程序漂浮,有利于测试/生产不好?只是想要一些输入。

5 个答案:

答案 0 :(得分:5)

在某些情况下,您无法真正避免Try/Catch

考虑一种情况,您希望用户输入要在数据库表中输入的一些数据。用户的输入也包括主键,现在,如果某个用户输入了重复的主键,您将获得异常。你现在要做什么 ?让系统崩溃或处理异常并向用户显示用户友好的消息,以输入不同/唯一的内容。

考虑一个示例,假设您要检查某个URL是否有效且可用,您可能需要一些方法,例如:(take from here)

private bool IfURLExists(string url)
{
    try
    {
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Method = "HEAD";
        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        return (response.StatusCode == HttpStatusCode.OK);
    }
    catch //may catch specific WebException First
    {
        return false;
    }
}

如果没有try/catch,上述方法将无效。

try/finally的另一个重要用法是使用using语句,using适用于那些实现IDisposable接口并转换为try/finally块的对象,因此如果发生异常将确保处置非托管资源。

如果你想对它们做一些有用的事情,通常只捕获那些例外,否则让exception bubble up

答案 1 :(得分:2)

使用try / catch / finally块绝对没有错,如果以周到的方式使用它们。

作为开发人员,您甚至无法想象客户可以思考的与您有多么不同,或者您的系统如何与不同系统进行交互或对您未曾想到的输入作出反应。

唯一的规则是:不要滥用。

答案 2 :(得分:2)

为什么那个人想完全摆脱try/catch/finally,这是完全不清楚的。

我甚至不明白为什么最后的块会出现在图片中?没有最后你怎么可靠地清理资源?

c#语言提供了using语句,它实际上是在try/finally构造上实现的一个合成糖,所以这是错的吗?还是辱骂?你可以实现一个没有try/finally的使用块吗?

foreach使用try/finally,以及您真正需要它的地方。

典型示例:考虑“套接字编程”,在处理套接字时,如何避免捕获SocketExceptionIOException?这有用吗?当然不。它们应该在你需要时使用。

结论:try/catch/finally应该以它应该的方式使用。你不应该吃异常,这并不意味着你必须让异常终止你的过程。你必须处理它。

答案 3 :(得分:1)

基本规则是在您可以处理它们的时间和地点捕获异常。如果你无法处理它们,请让它们通过。对程序进程中未被捕获的任何内容的最终处理可能是记录并向用户显示错误消息。

答案 4 :(得分:1)

你应该只捕捉你可以处理的异常,其他人应该冒泡。 您绝对不能捕获NullReferenceExceptionArgumentOutOfRangeException等异常。这些都是错误,并且会在代码中隐藏这些错误。

有关此主题的文章:Vexing exceptions