none
例外処理について RRS feed

  • 質問

  •  

    お世話になっております。

     

    static void Main()

    {

    try{

    MethodA();

    }catch(Exception except){

     //「3」

    }

    }

     

    static void MethodA()

    {

    try{

       int var1=1,var2=0;

      var1/=var2;

    }catch(DivideByZeroException divexcept){

    throw new Exception(); // 「1」ここでスローする

    }catch(Exception exccept)

    // 「2」

    }

    }

     

    「1」でスローした場合、「2」ではキャッチされずに、「3」でキャッチされます。

    「1」でスローした場合は、スタック上のコール元メソッドに関連付けられている

    例外情報テーブルから検索しに行くことになるのでしょうか?

    スローしたメソッドに関連付けられた例外情報テーブルは見に行かないのでしょうか?

     

    「1」では、プロテクトブロックコード(try{})ではないからなのでしょうか?

     

     

    ご教授ください。

     

    2008年8月6日 10:36

回答

  • こんにちは。

     

    Exceptionをthrowするということは、上位のメソッドへExceptionを投げることになります。

    なので、「1」でスローした場合、「3」へExceptionが渡ります。

     

    「2」でExceptionをcatchしたい場合、DivideByZeroException以外の例外処理が発生すれば、

    「2」でcatchされます。

     

    ただthrowするのではなく、引数に任意の文字列、catchしたExceptionを渡し、

    上位メソッド、またはイベントでInnerExceptionという形で、throwされ続けたExceptionの

    情報を取得することができます。

     

    例)

    static void Main()

    {

    try

    {

    MethodA();

    }

    catch(Exception except)

    {

        //「3」

       messagebox.show(except.InnerException.ToString());

    }

    }

     

    static void MethodA()

    {

    try

    {

       int var1=1,var2=0;

      var1/=var2;

    }

    catch(DivideByZeroException divexcept)

    {

         //「1」

         throw new Exception("1で例外発生", divexcept);

    }

    catch(Exception exccept)

    {

         // 「2」

         throw new Exception("2で例外発生", exccept);

    }

    }

     

    2008年8月6日 12:21
  •  OTAKA さんからの引用

    「1」でスローした場合、「2」ではキャッチされずに、「3」でキャッチされます。

     

    「1」では、プロテクトブロックコード(try{})ではないからなのでしょうか?

    catchで捕捉できる例外はその直前のtryブロック(try~最初のcatchまでの間)で発生/スローした例外のみです。

    catchブロックの中で発生/スローした例外はその外側のtry-catchが対応します。

     

    従って、”「1」では、プロテクトブロックコード(try{})ではない”が回答に近いと言えると思います。

    2008年8月6日 13:45
    モデレータ

すべての返信

  • こんにちは。

     

    Exceptionをthrowするということは、上位のメソッドへExceptionを投げることになります。

    なので、「1」でスローした場合、「3」へExceptionが渡ります。

     

    「2」でExceptionをcatchしたい場合、DivideByZeroException以外の例外処理が発生すれば、

    「2」でcatchされます。

     

    ただthrowするのではなく、引数に任意の文字列、catchしたExceptionを渡し、

    上位メソッド、またはイベントでInnerExceptionという形で、throwされ続けたExceptionの

    情報を取得することができます。

     

    例)

    static void Main()

    {

    try

    {

    MethodA();

    }

    catch(Exception except)

    {

        //「3」

       messagebox.show(except.InnerException.ToString());

    }

    }

     

    static void MethodA()

    {

    try

    {

       int var1=1,var2=0;

      var1/=var2;

    }

    catch(DivideByZeroException divexcept)

    {

         //「1」

         throw new Exception("1で例外発生", divexcept);

    }

    catch(Exception exccept)

    {

         // 「2」

         throw new Exception("2で例外発生", exccept);

    }

    }

     

    2008年8月6日 12:21
  •  OTAKA さんからの引用

    「1」でスローした場合、「2」ではキャッチされずに、「3」でキャッチされます。

     

    「1」では、プロテクトブロックコード(try{})ではないからなのでしょうか?

    catchで捕捉できる例外はその直前のtryブロック(try~最初のcatchまでの間)で発生/スローした例外のみです。

    catchブロックの中で発生/スローした例外はその外側のtry-catchが対応します。

     

    従って、”「1」では、プロテクトブロックコード(try{})ではない”が回答に近いと言えると思います。

    2008年8月6日 13:45
    モデレータ
  • ご返事ありがとうございました。

     

    catchで例外やスローを行った場合、そのcatchをプロテクトしているtryブロックのペアとなるcatchブロックで

    キャッチされることはことになるのですね。

     

     

    2008年8月7日 0:28
  • あちゃ。私の認識も間違ってたとはー。

    Azuleanさんフォローありがとうございましたm(_ _)m

    2008年8月7日 7:57