在C#中重新抛出异常

时间:2016-05-11 08:14:48

标签: c# exception-handling try-catch rethrow

我有一些代码可以捕获异常,回滚事务然后重新抛出异常。

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返回"测试"而不是"来自内部"。我想保持这个"从里面"消息原样。这种建议的更改会导致错误显示代码无处不在。 :/

2 个答案:

答案 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;
}

如果您不打算使用异常(例如,将消息传递到某处),则无需将其拉出到变量中。你可以简单地捕捉,做自定义的东西并扔掉。