C#中未处理的异常处理
Unhandled Exception handling in C#
我想了解 C# 程序如何处理未处理的异常。
我正在 windows 表单项目中进行测试,如果其他项目类型的答案不同,请告诉我。
我是 运行 来自 .exe 文件的程序,而不是来自 visual studio 调试器的程序。
代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//timer1.Interval = 10000
private void timer1_Tick(object sender, EventArgs e)
{
//throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
}
}
static class Program
{
static Form1 newForm;
static void Main()
{
Thread FormThread = new Thread(NewForm);
FormThread.Start();
Thread.Sleep(5000);
//throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
}
static void NewForm()
{
newForm = new Form1();
Application.Run(newForm);
}
}
我的问题是 C# 程序中未处理异常的 windows 响应是什么?
在上面的例子中:
如果 timer1_Tick 函数抛出异常(通过删除注释前缀),我收到以下消息:
如果 Main 函数抛出异常(通过删除注释前缀),我将收到以下消息:
为什么我收到 2 条不同的消息以及 windows/program "choose" 如何弹出消息。
谢谢。
在 WinForms 应用程序中,事件处理程序由 WindowsFormsSynchronizationContext
调用。当事件处理程序抛出未处理的异常时,上下文通过显示第一个错误对话框来处理它。那时同步上下文(它只是一个消息泵)仍然是 运行 并且它仍然可以继续处理其他事件,因此您可以选择。
相比之下,Main
方法由操作系统本身调用,以启动应用程序。如果那里有未处理的异常,WIndows 别无选择,只能终止应用程序,它会显示第二个对话框来通知您。
我想了解 C# 程序如何处理未处理的异常。
我正在 windows 表单项目中进行测试,如果其他项目类型的答案不同,请告诉我。
我是 运行 来自 .exe 文件的程序,而不是来自 visual studio 调试器的程序。
代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//timer1.Interval = 10000
private void timer1_Tick(object sender, EventArgs e)
{
//throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
}
}
static class Program
{
static Form1 newForm;
static void Main()
{
Thread FormThread = new Thread(NewForm);
FormThread.Start();
Thread.Sleep(5000);
//throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
}
static void NewForm()
{
newForm = new Form1();
Application.Run(newForm);
}
}
我的问题是 C# 程序中未处理异常的 windows 响应是什么?
在上面的例子中:
如果 timer1_Tick 函数抛出异常(通过删除注释前缀),我收到以下消息:
如果 Main 函数抛出异常(通过删除注释前缀),我将收到以下消息:
为什么我收到 2 条不同的消息以及 windows/program "choose" 如何弹出消息。
谢谢。
在 WinForms 应用程序中,事件处理程序由 WindowsFormsSynchronizationContext
调用。当事件处理程序抛出未处理的异常时,上下文通过显示第一个错误对话框来处理它。那时同步上下文(它只是一个消息泵)仍然是 运行 并且它仍然可以继续处理其他事件,因此您可以选择。
相比之下,Main
方法由操作系统本身调用,以启动应用程序。如果那里有未处理的异常,WIndows 别无选择,只能终止应用程序,它会显示第二个对话框来通知您。