1

例外をキャッチし、トランザクションをロールバックしてから例外を再スローするコードがあります。

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

このコードを使用すると、VS Code 分析で次のような警告がスローされます

代わりに、例外が最初に発生したスタックの場所を保持するために、引数なしで '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 は「From inside」ではなく「Test」を返します。「内側から」というメッセージはそのままにしておきたい。この提案された変更により、どこでもエラー表示コードで問題が発生します。:/

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 に答える