C# 异常构造函数类
当我使用这个时,它是否相同:C# 异常构造函数类,c#,C#,当我使用这个时,它是否相同: catch(Exception e) { throw new Exception("some Exception", e); } 这是: catch(Exception e) { throw new Exception("some Exception", e.InnerException); } 或者我遗漏了什么?在第二个示例中,您将丢弃捕获的异常,并使用其内部异常。您通常会像第一个示例中那样编写代码 在第一种情况下,捕获的异常e将成为您要抛出的新
catch(Exception e)
{
throw new Exception("some Exception", e);
}
这是:
catch(Exception e)
{
throw new Exception("some Exception", e.InnerException);
}
或者我遗漏了什么?在第二个示例中,您将丢弃捕获的异常,并使用其内部异常。您通常会像第一个示例中那样编写代码 在第一种情况下,捕获的异常e将成为您要抛出的新异常的InnerException:
catch(Exception e)
{
throw new Exception("some Exception", e);
}
在第二种情况下,您使用的是e的InnerException,来自e的数据丢失:
第一个例子一般来说更正确。当您作为另一个异常的结果抛出一个新异常时,您应该包括原始异常作为新异常的内部异常 但这并非普遍正确。在某些非常特殊的情况下,如果您想要撤消另一个代码对真实错误的包装,那么它可能非常有用
try {
// some reflection call
} catch (TargetInvocationException e) {
// Reduce the layers of data a developer has to dig through by using the real
// exception when I re-wrap
throw new MyException("some message", e.InnerException);
}
有三种方法可以重新引发异常:
catch (Exception ex)
{
throw;
}
抛出保留原始堆栈跟踪的原始异常
catch (Exception ex)
{
throw ex;
}
抛出原始异常,但原始堆栈跟踪丢失。堆栈跟踪现在将此行显示为异常的发起人
catch (Exception ex)
{
throw new Exception("...", ex);
}
抛出新异常,但保留原始异常及其堆栈跟踪作为新异常的InnerException
catch (Exception ex)
{
throw new Exception("...", ex);
}
第一种情况在需要清理失败而不是成功的地方很有用。如果在这两种情况下都需要清理,那么可以使用finally子句,而不是catch子句。或者,您只想记录在这里发生的异常,并让调用方处理它
第二种情况根本没有什么用处。为什么要隐藏堆栈跟踪?可能有一些罕见的情况下,这是有用的,但我知道没有
第三种情况最常用于希望返回单一类型的异常或类型族的情况。例如,您是一个文本解析方法,希望将所有非致命异常转换为ParseException或任何提供额外详细信息(如发生异常的文本中的行号)的内容
在您提供的第二个示例中,捕获的异常被完全丢弃。将生成一个新异常,原始异常的InnerException将成为此新异常的InnerException。我无法想象剥离中间异常会有什么用处。换句话说,我正在丢弃对象e中包含的异常?