トップ回答者
例外処理について

質問
-
お世話になっております。
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{})ではないからなのでしょうか?
ご教授ください。
回答
-
こんにちは。
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);
}
}
すべての返信
-
こんにちは。
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);
}
}