在.NET中,当捕获异常时,我是否应该始终捕获派生异常(所以不是ArgumentException而是派生类型)?
此外:
如果我被要求使用错误代码,那么它是否会像构造函数那样?:
抛出新的异常(“4000”,ex);
还是带有errorcode属性的自定义异常类型? (这可能会与SqlException等异常类型混淆,后者的错误代码映射到SQL Server错误。)
由于
答案 0 :(得分:6)
抓住您知道如何处理的最广泛的例外。
一般来说,这意味着您将捕获一个非常具体的异常。一些异常,如ArgumentException
s,不应该在所有b / c中捕获它们表示逻辑错误而不是运行时错误。我发现捕获更广泛的异常有用的一个地方是File I / O. IOException
可能是一个实用的高级别例外。
如果要求您使用错误代码,您可以使用异常的message属性来包装它,但我绝不会将其用作避免抛出适当类型异常的理由。这是因为这里有两个不同的问题:
一个。错误代码用于提供在现场发生故障时可以查找的特定信息。它绝不能用于以编程方式区分异常类型b / c语言具有为此设计的特定工具:异常类型。
湾适当类型的例外是提供区分异常的编程方式。该语言是为它设计的,使用它。不要永远抛出一个简单的Exception
。
我可能会在Exception.Data
collection中输入错误代码。这样可以避免覆盖Exception.Message
中的消息,否则这些消息对于诊断目的非常有帮助。
答案 1 :(得分:2)
这取决于您是要捕获确切的异常还是一组不同类型的异常。
有时您只想为1个确切的异常添加处理。其他时候,对于任何类型的异常,您的异常处理都是相同的,因此您可以只使用catch或只是捕获Exception
来查看异常是什么。
例如,您可能只想捕获1个确切的异常而没有其他异常处理。当你进一步了解调用堆栈时,你会抓住剩下的异常,但是你想要忽略你正在捕获的那个。