All*_*ons 3 c# exception-handling
我有一个常见的异常处理函数:
public static void ManageException(Exception ex,
string customErrorMsg,
bool displayMessage)
Run Code Online (Sandbox Code Playgroud)
我想从一些catch块中调用它.
处理异常后,我想重新抛出异常,同时保留堆栈跟踪.
我在某处读到了我应该throw
声明没有任何参数.该throw
声明(没有任何PARAMS)在正常工作catch
块,但在我的ManageException
功能,它给了我一个编译错误:
不允许在catch子句之外使用不带参数的throw语句
是否有任何解决方案可以从整个堆栈跟踪中重新抛出异常而不会对ManageException
函数产生任何性能影响?
我正在使用C#2.0.
如果确实需要在catch块之外重新抛出异常,可以使用以下方法:
ExceptionDispatchInfo.Capture(exception).Throw();
Run Code Online (Sandbox Code Playgroud)
ExceptionDispatchInfo类自 .NET Framework 4.5 起可用。
通常,您不需要使用此方法;相反,您可以 a) 使用 catch 块内的命令重新引发异常throw;
,或者 b) 将异常包装在另一个异常中。
您必须指定要抛出的异常,如:
throw ex;
Run Code Online (Sandbox Code Playgroud)
如您的错误中所述,您只能throw;
从catch块中重新抛出异常(with ).恕我直言,这是唯一有意义的地方; 你要么抓住异常,要么扔掉它,也许不应该两者兼顾.从一个叫做的方法ManageException
,我想知道你为什么要管理所述异常,但无论如何都要抛弃它.
也许您想要将原始异常包装在您自己的异常中,提供其他详细信息?在这种情况下,我会抛出一个新的异常与ex
作为InnerException
,如果要保留这些数据.
根据你的评论,如果你要做的是确定你是否应该重新抛出异常,我会建议:
TryManageException
并更改签名以返回bool
- 如果未正确管理异常并且需要重新抛出,则返回false; 如果处理则返回true.如果该方法返回false(=未管理),则从catch块重新抛出或执行您需要的任何其他操作:
try
{
decimal oops = 5 / 0;
}
catch (Exception e)
{
if (!CommonExceptionHandler.TryManageException(e, "oops", "oops"))
throw;
}
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
5443 次 |
最近记录: |