11

以下のようにカスタム例外クラスを作成しました

namespace testingEXception
{
    public class CustomException : Exception
    {            
        public CustomException()
        {
        }
        public CustomException(string message)
            : base(message)
        {
        }

        public CustomException(string message, Exception innerException)
            : base(message, innerException)
        {

        }
    }
}

このような同じソリューションで別のプロジェクトから例外をスローしています

namespace ConsoleApplication1
{
    public class testClass
    {
        public void compare()
        {
            if (1 > 0)
            {
                throw new CustomException("Invalid Code");
            }
        }
    }
}

そして、このようにそれをキャッチ

    namespace testingEXception
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                testClass obj = new testClass();
                obj.compare();

            }
            catch (testingEXception.CustomException ex)
            {
                //throw;
            }
            catch (Exception ex)
            {
               // throw new CustomException(ex.Message);
            }

            Console.ReadKey();
        }
    }
}

問題は、例外のタイプが CustomException を示しているにもかかわらず、例外が最初のキャッチではキャッチされず、代わりに 2 番目のキャッチでキャッチされることです。

4

1 に答える 1

2

詳細を提供する必要があります。次のコードは「CustomException」を出力します。

try
{
    throw new CustomException("Invalid code.");
}
catch (CustomException ex)
{
    System.Diagnostics.Trace.WriteLine("CustomException");
    throw;
}
catch (Exception ex)
{
    throw;
}

次のクラスで:

public class CustomException : Exception
{
    public CustomException()
    {
    }
    public CustomException(string message)
        : base(message)
    {
    }

    public CustomException(string message, Exception innerException)
        : base(message, innerException)
    {

    }
}

アップデート:

最適化と a:の最適化に関してはthrow、特定のコード ブロックは、スタックの上位にある呼び出し元がキャッチするコードを持っているかどうかを認識できないため、これは発生しませんCustomException。例外のスローは目に見える副作用であり、CLI にはさまざまな保証があり、これらの目に見える副作用が確実に見えるようになっています。

さらに、try、catch、および finally ブロックは、CLI で言えば「保護領域」です。これらの領域は、「目に見える」副作用を持つ領域内の操作は、目に見える副作用を並べ替えることができないという点で特別です。詳細については、 http://lynk.at/qH8SHkおよびhttp://lynk.at/pJcg98を参照してください。

于 2013-08-15T13:42:05.110 に答える