代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

捕获最派生的异常?

  •  6
  • GurdeepS  · 技术社区  · 14 年前

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

    也:

    如果要求我使用错误代码,这是否在构造函数中?:

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

    或者一个自定义的带有错误代码属性的异常类型?(这可能会与异常类型(如sqleexception)混淆,后者具有映射到SQL Server错误的错误代码)。

    谢谢

    2 回复  |  直到 14 年前
        1
  •  6
  •   Greg D    14 年前
    1. 抓住你知道如何处理的最广泛的例外。

      一般来说,这意味着您将捕获一个非常具体的异常。还有一些例外,比如 ArgumentException S,不应该在所有的B/C中被捕获,它们表示逻辑错误,而不是运行时错误。在文件I/O的情况下,我发现捕获更广泛的异常非常有用。 IOException 可以是一个实用的更高级的异常捕获。

    2. 如果要求您使用错误代码,您可以不必使用异常的消息属性来包装它,但我决不会将其用作避免引发适当类型的异常的原因。这是因为这里有两个不同的关注点:

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

      b.适当类型的异常是为了提供区分异常的编程方法。语言是为它设计的,使用它。不要 曾经 抛平原 Exception .

      我可能会向 Exception.Data collection . 这样可以避免在 Exception.Message 否则,这将对诊断有很大帮助。

        2
  •  2
  •   Brian R. Bondy    14 年前

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

    有时您只想为1个精确的异常添加处理。其他时候,对于任何类型的异常,您的异常处理都是相同的,因此您可以只放入catch或just catch Exception 看看例外是什么。

    例如,您可能希望只捕获1个准确的异常,而不捕获其他异常处理。当您进一步了解调用堆栈时,您会这样做,您将捕获其余的异常,但您只想忽略您正捕获的异常。