博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net主线程扑捉子线程中的异常
阅读量:6251 次
发布时间:2019-06-22

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

首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常。

代码
 
class
 Program
    {
        
static
 
void
 Main(
string
[] args)
        {
            
try
            {
                System.Threading.Thread thread 
=
 
new
 System.Threading.Thread(
new
 Program().run);
                thread.Start();
            }
            
catch
 (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Thread.Sleep(
1000
);
        }
        
public
 
void
 run()
        {
            
throw
 
new
 Exception();
        }
    }

 

为什么呢?

首先需要了解异常的实现机制:异常的实现机制是严重依赖与线程的栈的。每个线程都有一个栈,线程启动后会在栈上安装一些异常处理帧,并形成一个链表的结构,在异常发生时通过该链表可以进行栈回滚,如果你自己没有安装的话,可能会直接跳到链表尾部,那可能是CRT提供的一个默认处理帧,弹出一个对话框提示某某地址内存错误等,然后确认调试,取消关闭。

所以说,线程之间是不可能发生异常处理的交换关系的。

但是在实际的程序设计中,会牵涉到扑捉子线程的异常,那么该怎样解决这个问题呢?

代码
    
class
 Program
    {
        
private
 
delegate
 
void
 ExceptionHandler(Exception ex);
        
private
 
static
 ExceptionHandler exception;
        
private
 
static
 
void
 ProcessException(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        
static
 
void
 Main(
string
[] args)
        {
            exception 
=
 
new
 ExceptionHandler(ProcessException);
            System.Threading.Thread thread 
=
 
new
 System.Threading.Thread(
new
 Program().run);
            thread.Start();
            Thread.Sleep(
1000
);
        }
        
public
 
void
 run()
        {
            
try
            {
                
throw
 
new
 Exception();
            }
            
catch
 (Exception ex)
            {
                
if
 (exception 
!=
 
null
)
                {
                    exception(ex);
                }
            }
        }
    }

 

上面使用委托的方式,间接的解决了:把子线程中的异常信息交个主线程的一个方法去执行。(通过委托方式)

Best Reagrds,

Charles Chen

转载于:https://www.cnblogs.com/wwwzzg168/p/3570083.html

你可能感兴趣的文章
申小雨命案审理延期至3月5日 警方将翻译嫌犯口供
查看>>
redis按下ctrl + c进程就没了
查看>>
【JAVA】保龄球记分游戏
查看>>
mysql kernel: nf_conntrack version 0.5.0
查看>>
NFS网络文件共享服务的配置和排错总结
查看>>
ora-01200错误的分析
查看>>
Hyper-V 3 虚拟机快照之二 创建和查看快照
查看>>
2.[Struts2权威指南笔记]Servlet
查看>>
Android+TensorFlow+CNN+MNIST实现手写数字识别
查看>>
SCCM 2012系列11 补丁分发下
查看>>
Windows脚本初探之PowerShell变量和常量
查看>>
用Python简单处理SQL语句绕过防注入
查看>>
披星“戴”云,百治百效
查看>>
内存真实利用率
查看>>
由bean,及O/R映射文件导出数据库的方法ExportDB()
查看>>
2003加入域提示“用户已存在”
查看>>
基于Hadoop数据仓库Hive1.2部署及使用
查看>>
利用shell计算find命令查出后的总文件大小
查看>>
性能之外:LSI 6Gb/s SAS RAID渠道先行
查看>>
DataGridView打印类
查看>>