抛出异常的区别 throw 和throw ex
https://www.cnblogs.com/a164266729/p/4913898.html
在面试的过程中提到了异常捕获的的几种用法,之前一直使用但是没有仔细留意,调试程序的过程中发现还是有区别的,主要区别在堆栈信息的起始点不同,下边我们通过实例来看这集中不同的抛出异常的方法。
一般我们推荐throw来抛出异常,使用throw ex来抛出异常会清空存储的异常信息,认为已经处理过异常,只不过在抛出的过程中又产生的新的异常信息,从而找不到真正的错误源。
第一种 使用的人数最多,但是不推荐使用,这样处理异常程序会清空堆栈中的异常信息,在堆栈中重置异常点。
复制代码
1 try
2 {
3 }
4 catch (Exception ex)
5 {
6 throw ex;
7 }
复制代码
第二种 这种会追溯到异常的起源点,但是程序会报 定义的ex未被使用的警告
复制代码
1 try
2 {
3 }
4 catch (Exception ex)
5 {
6 throw;
7 }
复制代码
第三种 这中方式和第二种相同 可以捕获所有的异常,IDE也不会警告
复制代码
1 try
2 {
3 }
4 catch
5 {
6 throw;
7 }
复制代码
第四种 对异常重新包装,但同时保留了异常的起源点。
复制代码
1 try
2 {
3 }
4 catch (Exception ex)
5 {
6 throw new Exception("经过进一步包装的异常", ex);
7 }
复制代码
下边我们看具体使用过成中各种抛出异常的使用方法,对各种方法就会有了清晰的认识
复制代码
1 using System;
2
3 namespace Throw
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 ExceptionClass ec = new ExceptionClass();
10
11 try
12 {
13 ec.ExceptionThrow1();
14 }
15 catch (Exception ex)
16 {
17
18 Console.WriteLine(ex.ToString());
19 }
20 Console.WriteLine("----------------------华丽的分割线---------------------------");
21 try
22 {
23 ec.ExceptionThrow2();
24 }
25 catch (Exception ex)
26 {
27
28 Console.WriteLine(ex.ToString());
29 }
30 Console.WriteLine("----------------------华丽的分割线---------------------------");
31 try
32 {
33 ec.ExceptionThrow3();
34 }
35 catch (Exception ex)
36 {
37
38 Console.WriteLine(ex.ToString());
39 }
40 Console.WriteLine("----------------------华丽的分割线---------------------------");
41 try
42 {
43 ec.ExceptionThrow4();
44 }
45 catch (Exception ex)
46 {
47
48 Console.WriteLine(ex.ToString());
49 }
50 Console.WriteLine("----------------------华丽的分割线---------------------------");
51
52 Console.ReadKey();
53 }
54 }
55
56 ///
57 /// 测试上下文抛出异常 相关上下文 栈的调用情况
58 ///
59 public class ExceptionClass
60 {
61
62 private void ExceptionMethod()
63 {
64 throw new DivideByZeroException();
65 }
66
67 ///
68 /// 抛出异常的方法
69 ///
70 public void ExceptionThrow1()
71 {
72 try
73 {
74 this.ExceptionMethod();
75 }
76 catch (Exception ex)
77 {
78 throw ex;
79 }
80 }
81
82 public void ExceptionThrow2()
83 {
84 try
85 {
86 this.ExceptionMethod();
87 }
88 catch (Exception ex)
89 {
90
91 throw;
92 }
93 }
94
95 public void ExceptionThrow3()
96 {
97 try
98 {
99 this.ExceptionMethod();
100 }
101 catch (Exception)
102 {
103
104 throw;
105 }
106 }
107
108 public void ExceptionThrow4()
109 {
110 try
111 {
112 this.ExceptionMethod();
113 }
114 catch (Exception ex)
115 {
116
117 throw new Exception("经过进一步包装的异常",ex);
118 }
119 }
120 }
121 }
复制代码
程序运行结果

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现