尝试/捕获使用公约

时间:2012-02-06 21:10:08

标签: c# coding-style error-handling try-catch

在明显需要的位置之外(例如获取特定用户输入),Try / Catch的约定是什么?虽然代码重用是OOP背后的一个重要思想,但是期望每个(示例)数组访问都应该有try / catch吗?它主要是设计者决定什么可以抛出异常,而程序的那些部分应该受到足够的监管以至于不会抛出异常?

实施例。一系列扑克牌是,应该始终是52张牌。不需要尝试/捕获。 或者,因为数组超出范围异常可能会导致运行时错误,并且可以在以后添加漫游时使用套牌,然后将其放入?

7 个答案:

答案 0 :(得分:6)

你应该只捕捉异常,你可以实际处理。即你不应该在任何地方尝试/捕捉语句。

至于抛出异常,如果没有更好的选择,你应该抛出异常。如果您能够有意义地处理用户输入,那么在这种情况下没有理由抛出异常。在不知道细节的情况下,我会假设在这种情况下不需要例外。

答案 1 :(得分:4)

Trey Nash在他的书“Accelerated C#”中建议(可能大多数人)以一种否定使用try / catch分支的方式进行编程。您看到的大多数尝试/捕获都可以通过更好的编程来消除。有些情况下你需要它,主要是处理文件句柄,数据库连接,基本上任何时候你需要使用一个实现IDisposable类型的using语句(后面是一个try / finaly块)。在操作系统中使用某些东西可能出错的地方使用try catch。

尽量不要使用一般

 try {    //some exception thrown }
 catch (Exception ex) {     }

这太普遍了,尽你所能来处理可能发生的更相关的异常,而不是让它们都进入一般的捕获声明。

答案 2 :(得分:4)

你的例子有点偏。

假设你有一个包含52个元素的数组,正确的处理方法是在尝试访问它之前测试你的索引是否在数组的范围内。这比简单地将代码包装在try .. catch中要好得多。

尝试Catch可以帮助我们摆脱困境。如果给定的方法编码正确,那么使用它们的理由很少。正确地说,我的意思是你验证你的输入是在预期的范围内,你已经测试了足够的知识,代码不会“除外”。当然,“非常少”的示例包括对非托管资源(如SqlConnection对象)的调用。

重点是,这是一个最后的努力,以挽救可用于特定代码块执行的东西。

但是,如果没有什么可以对异常做什么,那么我会说你唯一的选择是忽略它并让它冒泡或捕捉,记录和重新抛出。

答案 3 :(得分:2)

一般来说,我倾向于捕获异常,记录它们,重新抛出,然后最终有一些应用程序级异常处理,这会给用户带来一般错误。

在您可能知道导致异常的原因的特定情况下(例如,您捕获到指示与数据库服务器的连接已关闭的异常),您将捕获特定异常,然后为该用户生成相应的错误消息。 p>

如果无效的用户输入导致异常,那么您有错误的代码,您需要验证您的输入。

答案 4 :(得分:2)

你应该避免使用try / catch,因为它非常昂贵。在大多数情况下,您可以实施必要的检查以避免抛出异常。

关于集合或数组,您可以检查集合中有多少项以避免错误。

使用try catch的有效位置是读取文件或访问第三方资源时。

当您捕获异常时,请记录它并尝试找到避免异常的方法。

同样,当重新抛出异常时,请使用下面的代码         尝试         {

    }
    catch (Exception ex)
    {
        throw;
    }

希望能回答你的问题。

答案 5 :(得分:1)

Try/Catch单独说,你尝试做某事,发生了什么事情(在我们的例子中没有好事)而你正试图抓住该例外用该信息做某事

道德:如果你知道可能存在异常,并且如果你知道如果发生了什么你会做什么,使用try/catch来开发你的异常处理逻辑。

如果没有,则try/finally有更多含义(例如在IO访问期间为分配的资源处理逻辑执行保证)。

希望这有帮助。

答案 6 :(得分:0)

我想我也会把它扔进混音中。 Eric Lippert在几年前发表了一篇关于此事的优秀文章:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx