There three kind of catch ... throw method:












The last two method are the same, while the first is different.
The first method will swallow down the exception's StackTrace
Example:
1
class Class1
2
{
3
[STAThread]
4
static void Main(string[] args)
5
{
6
try
7
{
8
Class1 app = new Class1();
9
app.fun();
10
}
11
catch (System.Exception e)
12
{
13
Console.WriteLine(e.StackTrace);
14
}
15
Console.ReadLine();
16
}
17
18
void fun()
19
{
20
try
21
{
22
throwE();
23
}
24
catch(Exception)
25
{
26
throw;
27
}
28
}
29
void throwE()
30
{
31
throw new Exception("my Exception");
32
}
33
}

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

the result is:
at ConsoleApplication1.Class1.throwE()
at ConsoleApplication1.Class1.fun()
at ConsoleApplication1.Class1.Main(String[] args)
if we change the fun() to :
1
void fun()
2
{
3
try
4
{
5
throwE();
6
}
7
catch(Exception e)
8
{
9
throw e;
10
}
11
}

2

3

4

5

6

7

8

9

10

11

the result is:
at ConsoleApplication1.Class1.fun()
at ConsoleApplication1.Class1.Main(String[] args)
we lose the true throw exception trace, so avoid "throw e"