捕获大多数派生的异常?

时间:2010-06-21 16:38:54

标签: c# exception exception-handling

在.NET中,当捕获异常时,我是否应该始终捕获派生异常(所以不是ArgumentException而是派生类型)?

此外:

如果我被要求使用错误代码,那么它是否会像构造函数那样?:

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

还是带有errorcode属性的自定义异常类型? (这可能会与SqlException等异常类型混淆,后者的错误代码映射到SQL Server错误。)

由于

2 个答案:

答案 0 :(得分:6)

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

    一般来说,这意味着您将捕获一个非常具体的异常。一些异常,如ArgumentException s,不应该在所有b / c中捕获它们表示逻辑错误而不是运行时错误。我发现捕获更广泛的异常有用的一个地方是File I / O. IOException可能是一个实用的高级别例外。

  2. 如果要求您使用错误代码,您可以使用异常的message属性来包装它,但我绝不会将其用作避免抛出适当类型异常的理由。这是因为这里有两个不同的问题:

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

    湾适当类型的例外是提供区分异常的编程方式。该语言是为它设计的,使用它。不要永远抛出一个简单的Exception

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

答案 1 :(得分:2)

这取决于您是要捕获确切的异常还是一组不同类型的异常。

有时您只想为1个确切的异常添加处理。其他时候,对于任何类型的异常,您的异常处理都是相同的,因此您可以只使用catch或只是捕获Exception来查看异常是什么。

例如,您可能只想捕获1个确切的异常而没有其他异常处理。当你进一步了解调用堆栈时,你会抓住剩下的异常,但是你想要忽略你正在捕获的那个。