2

助けてくれてありがとう。

除数が 1 の場合、このコードは期待どおりの結果を生成しません。ExceptOne の基本クラスが呼び出されず、ExceptOne のハイパーリンクが表示されません。何が足りないの?!

コンソール出力は次のとおりです。

除数を入力してください
1
WriteLine exception 1...
WriteLine exception 2...
base ctor2
http : // exc2.com
Writeline in finally

class Program
{
    static void Main(string[] args)
    {
        try
        {
            byte y = 0;
            byte x = 10;
            Console.WriteLine("enter a divisor");
            string s = (Console.ReadLine());
            y = Convert.ToByte(s);
            if (y == 1) throw new ExceptOne();
            Console.WriteLine("result is {0}", x / y); ;
        }

        catch (System.DivideByZeroException e)
        {
            Console.WriteLine("exception occured {0}...", e.Message);
        }

        catch (ExceptOne p)
        {
            Console.WriteLine(p.Message +"\n"+ p.HelpLink);

        }

        catch (System.Exception r)
        {
            Console.WriteLine(r.Message + "\n" + r.HelpLink);
        }

        finally
        {
            Console.WriteLine("Writeline in finally ");
            Console.ReadLine();
        }
    }
}

public class ExceptOne : System.Exception
{
    public ExceptOne()
        : base("base ctor 1 ")
    {
        this.HelpLink = "http://exc1.com";
        Console.WriteLine("WriteLine exception 1...");
        throw new Exception2();
    }
}

public class Exception2 : System.Exception
{
    public Exception2()
        : base("base ctor2 ")
    {
        Console.WriteLine("WriteLine exception 2...");
        this.HelpLink = "http://exc2.com";
    }
}
4

3 に答える 3

4

ExceptOne 例外のコンストラクターで例外をスローしています。したがって、ExceptOne オブジェクトは作成されず、その例外のキャッチはトリガーされません。

編集

コンストラクターで例外をスローしても問題ありません。参照: http://bytes.com/topic/c-sharp/answers/518251-throwing-exception-constructorおよびコンストラクターが例外をスローするのはいつですか?

于 2012-01-12T09:45:26.983 に答える
1

コンストラクターで例外を発生させると、メソッドでキャッチされない新しいタイプの例外がExceptOneスローされることがわかった場合、一般的な例外句でキャッチされます。Exception2Main(...)

于 2012-01-12T09:50:58.717 に答える
0

これは、ExceptOne で Exception2 をスローすると、(System.Exception r) ブロックによってメイン メソッドで Exception2 がキャッチされるために発生します。

ExceptOne のベースが呼び出され、その例外がキャッチされないため、メッセージ (base("base ctor 1 ") によって設定) は表示されません。

于 2012-01-12T09:51:32.493 に答える