c# - 在 C# 中重新抛出异常的正确方法是什么?

标签 c# .net exception

<分区>

这样做更好吗:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw;
}

或者这个:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw ex;
}

他们做同样的事情吗?一个比另一个好吗?

最佳答案

您应该始终使用以下语法重新抛出异常。否则你会破坏堆栈跟踪:

throw;

如果打印由 throw ex 产生的跟踪,您会看到它结束于该语句,而不是异常的真正来源。

基本上,使用 throw ex 应该被视为刑事犯罪。


如果需要重新抛出来自其他地方(AggregateException、TargetInvocationException)或另一个线程的异常,您也不应该直接重新抛出它。而是有 ExceptionDispatchInfo保留所有必要的信息。

try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // just to inform the compiler that the flow never leaves the block
}

关于c# - 在 C# 中重新抛出异常的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/178456/

相关文章:

动态生成类的 Ruby 异常继承

c# - 升级到版本 2.8 后,Azure 计算模拟器停止工作,先决条件错误

c# - 我的 OSDB 哈希算法有什么问题?

.net - 打印多页不同数据

.net - 通用 IBindingListView 实现

python - 在 Python 的交互式 shell 中处理没有 try block 的异常

c# - 如何惰性地获取空组

c# - 当 Gen2 中存在大量对象时,使用 WinDbg 查找内存泄漏

c# - 帮助理解 .NET 委托(delegate)、事件和事件处理程序

python - 暂停 PyCharm 中 Django 应用程序内部引发的异常