1

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

catch ( Exception exSys )   {
    bqBusinessQuery.RollBackTransaction();
    throw exSys ;
}

如果我使用此代码,VS Code 分析会引发警告说

改为使用不带参数的“抛出”,以保留最初引发异常的堆栈位置。

如果我使用代码

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 返回“Test”而不是“From inside”。我想保持“来自内部”的信息不变。这个建议的更改将导致到处出现错误显示代码的问题。:/

4

2 回答 2

10

您不必将变量绑定到异常:

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;
}
于 2016-05-11T08:17:04.323 回答
5
catch (Exception)   
{
    bqBusinessQuery.RollBackTransaction();
    throw;
}

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

于 2016-05-11T08:17:14.330 回答