2010-06-21 71 views
6

在.NET中,当捕获异常时,我应该总是捕获派生异常(所以不是ArgumentException,而是派生类型)?捕获大多数派生异常?

另外:

如果有人问我使用错误代码,这会不会在构造函数中,像这样?:

抛出新的异常(“4000”,前);

或者是一个具有errorcode属性的自定义异常类型? (这可能会引起异常类型的混淆,例如SqlException,其中的错误代码映射到SQL Server错误)。

感谢

+0

从哪里来的错误代码?这些错误代码是否为原生Win32错误代码? – 2010-06-21 16:53:24

回答

6
  1. 抓住最广泛的例外,你知道如何处理。

    一般来说,这意味着你会捕捉一个非常特殊的异常。有些例外,如ArgumentException,不应该在所有的b/c中被捕获,它们表示逻辑错误而不是运行时错误。在文件I/O的情况下,我发现捕捉更广泛的异常有用的地方是有用的。一个IOException可能是一个实际的更高级别的例外。

  2. 如果您被要求使用错误代码,您可以避免使用异常的消息属性来包装它,但我绝不会使用它作为避免引发适当类型异常的原因。这是因为这里有两个单独的问题:

    a。错误代码用于提供特定的信息,可以在现场发生故障时查找。它不应该用于以编程方式区分异常类型。b/c语言具有专门为此设计的特定工具:异常类型。

    b。适当类型的例外是提供区分例外的程序化方式。该语言是为它设计的,使用它。不要有史以来扔一个普通的Exception

    我可能会在Exception.Data collection中输入错误代码。这样可以避免覆盖Exception.Message中的消息,否则这些消息对诊断目的非常有用。

+0

我不确定关于ArgumentException与其他许多类型差不多的“严重性”有很多基础。捕捉异常时真正需要知道的是系统的状态(以及抛出异常的例程是否影响它)。如果尝试例如解析一个文件,我不确定在调用例程之前验证所有字段是非常有价值的,如果它们的参数无效,那么抛出ArgumentException,除非我自己的代码在给出无效输入的情况下可以做比抛出异常更有用的东西。所以我几乎看不到它意味着“逻辑错误”。 – supercat 2011-02-04 21:30:41

2

如果你想赶上一个确切的异常或一组不同类型的异常的这取决于。

有时您只想为1个确切的异常添加处理。其他时候,你的异常处理对于任何类型的异常都是一样的,所以你可以把catch或者只是捕获Exception来查看异常是什么。

例如,您可能只想捕获1个确切的异常并且没有其他异常处理。当你知道进一步调用堆栈的时候,你会这样做,你正在捕获其余的异常,但是你只想忽略你正在捕获的异常。