1. ホーム
  2. c#

[解決済み] 投げる」と「投げる元」は違うのですか?

2022-02-18 06:49:46

質問内容

すでにこの2つの違いは何ですかという書き込みがあります。
(なぜこんなことを言わなければならないのか...)

しかし、私の質問は、私が別のエラーで "throw ex" を呼び出しているという点で、異なっています。 神々しい を処理する方法です。

public class Program {
    public static void Main(string[] args) {
        try {
            // something
        } catch (Exception ex) {
            HandleException(ex);
        }
    }

    private static void HandleException(Exception ex) {
        if (ex is ThreadAbortException) {
            // ignore then,
            return;
        }
        if (ex is ArgumentOutOfRangeException) { 
            // Log then,
            throw ex;
        }
        if (ex is InvalidOperationException) {
            // Show message then,
            throw ex;
        }
        // and so on.
    }
}

もし try & catch が使用されていました。 Main であれば、私なら throw; を使用してエラーを再スローします。 しかし、上記の単純化されたコードでは、すべての例外は HandleException

throw ex; を呼び出すのと同じ効果があります。 throw の中で呼ばれた場合 HandleException ?

解決方法は?

はい、違いますね。

  • throw ex はスタックトレースをリセットします (したがって、エラーは HandleException )
  • throw はしない - 元の違反者は保存されます。

    static void Main(string[] args)
    {
        try
        {
            Method2();
        }
        catch (Exception ex)
        {
            Console.Write(ex.StackTrace.ToString());
            Console.ReadKey();
        }
    }
    
    private static void Method2()
    {
        try
        {
            Method1();
        }
        catch (Exception ex)
        {
            //throw ex resets the stack trace Coming from Method 1 and propogates it to the caller(Main)
            throw ex;
        }
    }
    
    private static void Method1()
    {
        try
        {
            throw new Exception("Inside Method1");
        }
        catch (Exception)
        {
            throw;
        }
    }