CS.EXCEPT.RETHROW

例外の再スロー中にスタックトレースのクリアを避けます。

キャッチされた例外を再スローすることは、例外が再スローされ、スタックトレースがクリアされるため、避けてください。その一方で、単純な "throw;" は、キャッチされた式を再スローし、スタックトレースを保持します。追加情報を追加し、新しい例外をスローする必要が本当にある場合は、新しくスローされた例外で、元の例外を InnerException として保持する必要があります。

脆弱コード例

コピー
  public class Class1
  {
      public void method1()
      {
          try
          {
              // Code
          }
          catch (Exception ex)
         {
             // Exception handling code
             throw ex; // Violation
         }
     }
 }

修正コード例

コピー
      public class Class1
      {
          public void method1()
          {
              try
              {
                  // Code
             }
              catch (Exception ex)
             {
                 // Exception handling code
                 throw; // FIXED
             }
 // alternative
             try
             {
                 // Code
             }
             catch (Exception ex)
             {
                 // Exception handling code
                 Exception ex2 = new Exception("more info", ex);
                 throw ex2; // FIXED, added more info to the exception
             }
         }
     }