C# 多线程异常处理
下面是一个简单的程序:C# 多线程异常处理,c#,multithreading,exception-handling,C#,Multithreading,Exception Handling,下面是一个简单的程序: class Program { static Calc calc = new Calc(); static void Main(string[] args) { try { var t1 = new Thread(calc.Divide); t1.Start(); } catch (DivideByZeroException e)
class Program
{
static Calc calc = new Calc();
static void Main(string[] args)
{
try
{
var t1 = new Thread(calc.Divide);
t1.Start();
}
catch (DivideByZeroException e)
{
//Console.WriteLine("Error thread: " + e.Message);
}
try
{
calc.Divide();
}
catch (Exception e)
{
//Console.WriteLine("Error calc: " + e.Message);
}
}
class Calc
{
public int Num1;
public int Num2;
Random random = new Random();
public void Divide()
{
for (int i = 0; i < 100000; i++)
{
Num1 = random.Next(1, 10);
Num2 = random.Next(1, 10);
try
{
int result = Num1 / Num2;
}
catch (Exception ex)
{
throw ex;
}
Num1 = 0;
Num2 = 0;
}
}
}
}
类程序
{
静态计算=新计算();
静态void Main(字符串[]参数)
{
尝试
{
var t1=新螺纹(计算除法);
t1.Start();
}
捕获(除零例外)
{
//Console.WriteLine(“错误线程:+e.Message”);
}
尝试
{
计算除法();
}
捕获(例外e)
{
//Console.WriteLine(“错误计算:+e.Message”);
}
}
类计算
{
公共int Num1;
公共国际单位m2;
随机=新随机();
公共部门
{
对于(int i=0;i<100000;i++)
{
Num1=随机。下一个(1,10);
Num2=随机。下一个(1,10);
尝试
{
int结果=Num1/Num2;
}
捕获(例外情况除外)
{
掷骰子;
}
Num1=0;
Num2=0;
}
}
}
}
两个线程同时执行相同的方法。其中一个函数将Num1设置为0,而另一个函数试图同时除以Num1(0)。问题是为什么抛出异常,为什么它没有被主方法内的try-catch块捕获
主线程是一个线程,新线程是另一个线程。这两个线程彼此不通信,这意味着它们是完全独立的。如果您想在主线程上捕获异常,有两种方法
Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
及
异常不会从一个线程冒泡到启动它的线程。甚至可能无法保证启动引发异常的线程的原始线程是否仍然存在。此外,请注意,即使捕获到异常,IDE有时(取决于设置)也会在异常发生时停止(在这种情况下,它不会被第一个
捕获捕获)
始终是。TPL的一个(n重要)特性是捕获并处理调用方的异常。裸线程不能做到这一点。
void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//handle the exception
}