気になった事を自由に書いてます。
      
たまに見かけるソース①
たまにtry~catchの例外処理で下のようなコードを見かける。
1
2
3
4
5
6
7
8

try
{
	…
}
catch(Exception ex)
{
	throw ex;  ←これ
}

多分このメソッドより上(呼び出し元)の方で例外を処理してね。
という意味合いで使っているのだが(私もそうでした)、実はこうすると
例外が発生した場所StackTraceの情報が消えてしまう。
(Message情報は残ってます)
throw exを行うとどうなるか?と対応策が下のコードになります。

テストコード
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

namespace HP
{
    public class BizSample
    {
        public void BizTest()
        {
            throw new Exception("BizSampleクラスのBizTest()で例外発生");
        }
    }
    public partial class Form14 : Form
    {
        public Form14()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Test01();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }
        private void Test01()
        {
            try
            {
                BizSample biz = new BizSample();
                biz.BizTest();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void Test02()
        {
            try
            {
                BizSample biz = new BizSample();
                biz.BizTest();
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}
Test01を実行するとこんな感じになります。
BizSampleクラスのBizTest()で例外発生
場所 HP.Form14.Test01()
場所 HP.Form14.button1_Click(Object sender, EventArgs e)

Test02を実行すると
BizSampleクラスのBizTest()で例外発生
場所 HP.BizSample.BizTest()
場所 HP.Form14.Test02()
場所 HP.Form14.button1_Click(Object sender, EventArgs e)

どこで例外が発生したのか分かるようにするべきなのでthrow ex;でなく
throw;の方がよいです。
参考:
http://msdn.microsoft.com/ja-jp/library/ms182363(v=vs.80).aspx
      






Copyright (C) 2011 - 2017 猫の気ままなC#日記