Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抛出新的异常最佳实践_C#_.net_Exception_Exception Handling - Fatal编程技术网

C# 抛出新的异常最佳实践

C# 抛出新的异常最佳实践,c#,.net,exception,exception-handling,C#,.net,Exception,Exception Handling,以下是良好做法吗?如果不是,应该做什么 catch(Exception e) { throw new Exception(e.Message, e); } 不,如果您使用相同的消息抛出另一个完全相同类型的异常,那么这不是一个好的做法。这样做会使堆栈跟踪复杂化,并使调试更加困难 如果您要抛出一个新异常,那么它应该在某些重要方面与原始异常不同。例如,它应该是另一种类型,或者以其他方式(如更具体的错误消息)澄清异常的原因。如果您不能做这两件事,那么只需使用throw重新显示当前异常 或者,

以下是良好做法吗?如果不是,应该做什么

catch(Exception e)
{
     throw new Exception(e.Message, e);
}

不,如果您使用相同的消息抛出另一个完全相同类型的异常,那么这不是一个好的做法。这样做会使堆栈跟踪复杂化,并使调试更加困难

如果您要抛出一个新异常,那么它应该在某些重要方面与原始异常不同。例如,它应该是另一种类型,或者以其他方式(如更具体的错误消息)澄清异常的原因。如果您不能做这两件事,那么只需使用
throw重新显示当前异常


或者,更妙的是,根本就没有抓住它。重新刷新实际上也会稍微弄乱堆栈跟踪(当前帧的错误位置设置为重新刷新点,而不是异常发生的位置),因此如果您没有任何个人必须做的事情来处理异常,然后放手——让它传播并让调用方处理它。

只需重新显示捕获到的异常,无需创建新的异常

catch(Exception e)
{
    // Do some logging...
    throw;
}

一些关于重新引用堆栈跟踪上的异常和含义的阅读:

这取决于您尝试执行的操作。确切的代码是没有意义的,但是

catch(Exception ex)
{
    throw new ApplicationSpecificException("Error while doing something specific: " + contextualData, ex);
}

将在调试时提供极大帮助。

如果需要在重新抛出异常之前对异常执行某些操作,请执行以下操作:

catch(Exception e)
{
     // Additional handling here
     throw;
}
Throw
本身只是重新抛出当前异常。如果你不需要在这里处理它,首先不要抓住它


此外,在您的示例中,您正在捕获任何类型的异常,但在其位置抛出了一个通用的
异常
——可能不是很有用。

如果代码确实是:

try
{
  // something
}
catch(Exception e)
{
  throw new Exception(e.Message, e);
}
只需删除try/catch,它不会产生任何效果。交换
抛出对于<代码>抛出新…
更好,但仍然没有效率


如果捕获过程中发生了其他事情,请按照Gromer细节操作,只需使用
throw

@codingbiz:不,不!这会破坏堆栈跟踪。@SLaks Cool!我从来不知道。但是怎么办?怎么办?你只要做
销毁堆栈跟踪是什么意思?@codingbiz:当你抛出一个异常时,它会被一个从抛出点开始的堆栈跟踪初始化。如果抛出e
,该跟踪将被重新初始化——并且所有已捕获的堆栈跟踪信息都将丢失,这意味着您看不到比抛出点更深的帧。重新刷新不能做到这一点(尽管它会将当前帧的错误位置设置为重新刷新的点)。实际上,他的代码并不是毫无意义的,相反。它会将一个
应用程序规范异常
变成一个普通的ol'
异常
,这可能比什么都不做更糟糕。@Servy-这仍然是一个非常模糊的问题。你想完成什么?如果不知道这一点,就不可能有“最佳实践”。我已经回顾了一些到处都有这种类型异常处理的代码。我认为这是不正确的,只使用“throw;”是正确的。如果它只是
catch(Exception e){throw new Exception…
,那么只需删除try/catch就可以了。我以前见过这种模式,我不知道它从何而来;但这会导致调试时间过长。如果catch只是抛出,只需删除try/catch(
抛出;
抛出新异常…
)重新引用上面的方法的缺点是什么,性能,数据丢失?是的,数据丢失,特别是堆栈跟踪。通过执行
抛出e
,您正在重新启动堆栈跟踪。相反,只执行
抛出
,将保留来自底层异常的堆栈跟踪。