奇怪的异常处理实践

时间:2009-07-14 22:58:46

标签: c# visual-studio-2008 exception-handling

我见过这样的代码(实际上看到另一个人输入了代码):

catch (Exception ex)
{
    string exception = ex.ToString();
}

这段代码不好吗?如果是这样,为什么?有一个合适的“捕获处理程序链”(例如上面更具体的一个,过滤到一般捕获所有异常,但在异常的字符串转换中,我猜你转换的数量远远超过可能需要的字符串(您真正需要的只是InnerMessage或其他字符串属性之一,具体取决于方案)。此代码还有什么问题吗?

我也看到开发人员在每一行代码上放置了断点。这有什么意义?为什么不把它放在顶部然后使用“run to cursor”(喜欢那个功能)?

最后,在Visual Studio中对所有异常使用break有什么好处?

5 个答案:

答案 0 :(得分:3)

   string exception = ex.ToString();

那不做任何事情。最好记录它或使用MessageBox.Show(...);。

每一行的断点......没多大意义 - 使用run to cursor或step over / step in。

打破所有例外:我实际上已经使用过了。我有一些异常失败,一些图书馆默默地“处理”了。打破所有帮助我追踪下来。此外,“Break on all”可以帮助您确保只获得预期的异常(还有助于不捕获通用的“异常”类,但仅捕获特定异常。

答案 1 :(得分:3)

这看起来像一个懒惰的程序员:

  1. 不想正确处理异常
  2. 如果有异常,想要设置断点。

答案 2 :(得分:2)

您发布的代码的唯一值是允许在调试器中显示完整的异常。它不是必需的,因为调试器无论如何都会这样做,但是在调试器执行之前可能还有这段代码。

答案 3 :(得分:2)

这位开发人员可能不知道你可以捕获像这样的所有(托管)异常......

try
{
  // do something
}
catch( Exception )
{

}

并没有遇到像这样的catch块的编译器警告......

catch( Exception ex )
{
  // don't use ex
}

另外,他可能不知道$exception pseudo-register

答案 4 :(得分:0)

我昨天刚刚使用了“中断所有例外”。

我正在追逐一个非常模糊的bug(事实上,代码工作得很好,这是最难找到的bug),而我的C#代码正在执行一个显然出现故障的IronPython脚本,我保留了收到ArgumentException个消息显示在控制台中。

事实证明这个IronPython代码:

try:
    value += x
except ValueError:
    pass

导致在IronPython运行时内抛出并处理ArgumentException

此外,如果您打开了“中断所有异常”,VS实际上会在value += x行中断,调用Python源,让您检查本地值等等。非常好。无论如何,现在当我看到控制台中出现这些异常消息时,我不再担心我会忽略一些会让我感到厌恶的东西。