我正在尝试使用以下C#语句来崩溃LINQPad4:
new Thread(() => new Thread(() => { throw new Exception(); }).Start()).Start();
显示未处理的异常对话框,但该过程不会消失。我想IsTerminating = true就像在所有UnhandledThreadExceptions中一样......它是如何阻止进程死亡的?
答案 0 :(得分:5)
它也有一个全局异常处理程序,用于所有非UI线程异常,类似于Main方法:
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
当然还有其他一些小事要做,加上关于Application.Run的try / catch。
请在此处查看完整的文章和详细信息:C# Tutorial - Dealing With Unhandled Exceptions
编辑: hb。尝试调试这个:; - )
using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
new Thread(() => new Thread(() => { throw new ApplicationException("Ciao"); }).Start()).Start();
try
{
Application.Run(new Form1());
}
catch (Exception exc)
{
System.Diagnostics.Debug.WriteLine(exc.Message);
}
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// here catching Unhandled Exceptions
System.Diagnostics.Debug.WriteLine(e.ExceptionObject.ToString());
}
}
}
答案 1 :(得分:1)
LINQPad似乎不仅执行其查询,还在其自己的AppDomain中加载其依赖项。如果在应用程序中创建新的AppDomain,则可以友好的方式处理异常,并以友好的方式重新加载/编译应用程序。
更有趣的是LINQPad如何处理其依赖项。显然它们在加载到这些AppDomain时被“阴影复制”,因为我有一个我开发的自定义库,我能够“即时”更改它,LINQPad不会锁定文件;相反,似乎它有一个FileSystemWatcher查找文件的更改,卸载AppDomain,然后重新加载具有新依赖项的AppDomain。
构建新库之后应用程序中的“暂停”,然后我添加的那些新“方法”现在通过intellisense可用于脚本表明LINQPad在处理脚本和引用库时非常智能:a)不仅改变;但是b)可能导致它崩溃。
但是,如果您真的想要玩得开心,可以随时使用System.Diagnostics.Debugger.Break()。如果在LINQPad属性中关闭脚本优化,则可以实际调试到LINQPad进程,在Visual Studio调试器窗口中获取源代码,放置断点,单步执行,检查变量等,以便实际调试'你在LINQPad中创建的代码片段。在你的脚本中有一些额外的行,但是如果你在LINQPad中做一些繁重的脚本/测试,这是值得的。
这仍然是我能够找到原型,单元测试和构建C#代码的最好的工具之一,它使用我可以剪切的LINQ查询。以相对容易的感觉粘贴到应用程序中,它们的行为与观察到的一样。