我有一些代码可以捕获异常,回滚事务然后重新抛出异常。
catch ( Exception exSys ) {
bqBusinessQuery.RollBackTransaction();
throw exSys ;
}
如果我使用此代码,VS代码分析会抛出警告
使用' throw'而不是参数,以保留最初引发异常的堆栈位置。
如果我使用代码
catch ( Exception exSys ) {
bqBusinessQuery.RollBackTransaction();
throw;
}
然后我收到警告说
变量' exSys'声明但从未使用
我该如何解决这个问题?
修改 我试过这种方法,但它没有用。 system.exception类需要额外的消息以及内部异常。如果我这样做,它将抛出一条新消息,覆盖原始异常中的消息。我不想获得新的异常,我想用相同的消息抛出相同的异常。
catch (System.Exception ex)
{
throw new System.Exception(ex);
}
修改
catch (System.Exception ex)
{
throw new System.Exception("Test",ex);
}
尝试过这种方法。然后使用throw new Exception("From inside");
手动导致异常。现在,ex.Message返回"测试"而不是"来自内部"。我想保持这个"从里面"消息原样。这种建议的更改会导致错误显示代码无处不在。 :/
答案 0 :(得分:8)
您不必将变量绑定到异常:
try
{
...
}
catch (Exception)
{
bqBusinessQuery.RollBackTransaction();
throw;
}
实际上,在您的情况下,当您捕获任何异常时,您甚至不必命名异常类型:
try
{
...
}
catch
{
bqBusinessQuery.RollBackTransaction();
throw;
}
或者(如建议@Zohar Peled)使用捕获的异常作为内部异常抛出一个新异常。这样,您既可以保留堆栈,又可以为异常提供更多上下文。
try
{
...
}
catch (Exception e)
{
throw new Exception("Transaction failed", e);
}
如果您确实想要将异常用于某些处理(例如记录它),但想要完整地重新抛出它,请声明变量,但使用普通throw
:
try
{
...
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw;
}
答案 1 :(得分:5)
catch (Exception)
{
bqBusinessQuery.RollBackTransaction();
throw;
}
如果您不打算使用异常(例如,将消息传递到某处),则无需将其拉出到变量中。你可以简单地捕捉,做自定义的东西并扔掉。