博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异常处理 的相关注意事项
阅读量:6566 次
发布时间:2019-06-24

本文共 4607 字,大约阅读时间需要 15 分钟。

本例描述几个常用的异常处理,及可能出现的问题:

finally的相关使用

嵌套异常

捕获多线程的异常[使用事件通知的方式,将异常包装到主线程中]

 

using System; using System.Threading.Tasks; namespace ConsoleApp_HandleException {
class Program {
static void Main(string[] args) {
//TestInvoke(); //MethodWithTryNesting(); //Console.WriteLine(); //MethodWithTry(); TryCatchMultiThreadException2(); Console.ReadKey(); } #region finally的相关使用 static void TestInvoke() {
int result1 = TestIntReturnBelowFinally(); int result2 = TestIntReturnInTry(); User result3 = TestUserReturnInTry(); Console.ReadKey(); } static int TestIntReturnBelowFinally() {
int i; try {
i = 1; } finally {
i = 2; Console.WriteLine("\t 将int结果改为2,finally执行完毕!"); } return i;//执行顺序:try,finally,return i为2,返回2 } static int TestIntReturnInTry() {
int i; try {
return i = 1;//执行顺序:i=1,finally,return 返回值为1,i=2(在finally中的修改,未能影响到返回值) } finally {
i = 2; Console.WriteLine("\t 将int结果改为2,finally执行完毕!"); } } //返回名称为Li si static User TestUserReturnInTry() {
User user = new User() { Name = "Zhang san" }; try {
return user;//执行顺序:try,finally,return 返回名称为Li si(在finally中的修改,(由于是引用类型,所以)影响到了返回值) } finally {
user.Name = "Li si"; Console.WriteLine("\t 将user.Name改为 Li si !"); user = null;//返回值的名称为Li si,因为2个引用指向同一个内存,只是将其中一个引用置空了 } } class User {
public string Name; } #endregion #region 捕获异常 /* 避免使用: * catch (Exception err) * {
* throw err; * } * * 改用: * catch //(Exception) //可以返回出错的位置 * {
* throw; * } * * 外界再次捕获异常时,无法找到原始出错的位置,堆栈被重置了 (只能显示MethodWithTry方法中的catch位置) * */ /// /// 嵌套异常 /// static void MethodWithTryNesting() {
try {
MethodWithTry(); } catch (Exception error1) {
Console.WriteLine(error1.StackTrace); } } static void MethodWithTry() {
try {
Method1(); } //catch (Exception err)//外界再次捕获异常时,无法找到原始出错的位置,堆栈被重置了 (只能显示MethodWithTry方法中的catch位置) //{
// throw err; //} catch //(Exception) //可以返回出错的位置 {
throw; } } static int Method1() {
int i = 0; return 10 / i; } #endregion #region 捕获多线程的异常[在Windows应用程序中] //public void TryCatchMultiThreadException() //{
// Thread t=new Thread((ThreadStart) delegate // {
// try // {
// throw new Exception("非UI线程异常"); // } // catch (Exception ex) // {
// //将线程内部的异常传递到主线程上 // this.BeginInvoke((Action) delegate // {
// throw ex; // }); // } // }); //} #endregion #region 捕获多线程的异常[使用事件通知的方式,将异常包装到主线程中] private static event EventHandler
AggregateExceptionCatched; public class AggregateExceptionArgs : EventArgs {
public AggregateException AggregateException { get; set; } } public static void TryCatchMultiThreadException2() {
AggregateExceptionCatched += Program_AggregateExceptionCatched; Task t = new Task(() => {
try {
//do something 执行正常代码,产生了异常 throw new InvalidOperationException("任务并行编码中产生的未知异常"); } catch (Exception err) {
AggregateExceptionArgs errArgs = new AggregateExceptionArgs() {
AggregateException = new AggregateException(err) }; AggregateExceptionCatched(null, errArgs); } }); t.Start(); Console.WriteLine("主线程即将结束"); Console.ReadKey(); } static void Program_AggregateExceptionCatched(object sender, Program.AggregateExceptionArgs e) {
foreach (var item in e.AggregateException.InnerExceptions) {
Console.WriteLine("异常类型:{0}{1}来自:{2}{3}异常内容:{4}", item.GetType(), Environment.NewLine, item.Source, Environment.NewLine, item.Message); } } #endregion } }

转载地址:http://jcdjo.baihongyu.com/

你可能感兴趣的文章
在不同域中各个系统拥有自已独立的用户系统时的单点登录问题
查看>>
MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength
查看>>
六分钟学会创建Oracle表空间的步骤
查看>>
数据公钥加密和认证中的私钥公钥
查看>>
oracle惯用缩写的含义
查看>>
boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转
查看>>
[CLR via C#]5.3 值类型的装箱和拆箱
查看>>
c语言中的位移位操作
查看>>
趋势型指标——MACD
查看>>
object-c语言的nonatomic,assign,copy,retain的区别
查看>>
Ubuntu12.04版本安装arm-linux-gcc 4.3.3
查看>>
js 正则之检测素数
查看>>
linux-多线程
查看>>
中国版 Ubuntu Kylin 14.04 LTS 麒麟操作系统中文版发布下载 (Ubuntu天朝定制版)
查看>>
JAVA必备——13个核心规范
查看>>
第37周五
查看>>
hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)
查看>>
android常见错误-Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
查看>>
第40周二
查看>>
用户注册
查看>>