Try句の中では階層が深いところの例外でもキャッチできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); try { new Test().TestMethod(); } catch(Exception e) { MessageBox.Show(e.Message); // 0で除算しようとしました。 } } } class Test { public void TestMethod() { new Test2(); } } class Test2 { public Test2() { int i = 0; int ii = 1 / i; } } |
Try句自体が階層になっている場合は上位に通知されない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); try { new Test().TestMethod(); } catch(Exception e) { MessageBox.Show(e.Message); // ① } } } class Test { public void TestMethod() { try { int i = 0; int ii = 1 / i; } catch (Exception e) { MessageBox.Show(e.Message); // ② // 0で除算しようとしました。 // ①ではキャッチされない } } } |
上位に通知する場合はCatch句の中でThrowする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); try { new Test().TestMethod(); } catch(Exception e) { MessageBox.Show(e.Message); // 0で除算しようとしました。 } } } class Test { public void TestMethod() { try { int i = 0; int ii = 1 / i; } catch (Exception e) { MessageBox.Show(e.Message); // 0で除算しようとしました。 throw; // これでメッセージが2度表示される } } } |
メッセージを持って上位に通知することもできる。①、②と表示される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); try { new Test().TestMethod(); } catch(Exception e) { MessageBox.Show("②" + e.Message); // ②エラー } } } class Test { public void TestMethod() { try { int i = 0; int ii = 1 / i; } catch (Exception e) { MessageBox.Show("①" + e.Message); // ①0で除算しようとしました。 throw new Exception("エラー"); } } } |