和未处理的异常
本文关键字:异常 未处理 | 更新日期: 2023-09-27 18:09:16
我正在尝试使用以下c#语句使LINQPad4崩溃:
new Thread(() => new Thread(() => { throw new Exception(); }).Start()).Start();
将显示一个未处理的异常对话框,但进程不会死亡。我想isterating = true就像所有unhandledthreadexception一样…它如何阻止这个过程的死亡?
对于所有非UI线程异常也有一个全局异常处理程序,类似于Main方法:
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
当然还有其他小事情要做,像往常一样,在Application.Run.
周围的try/catch。在这里查看完整的文章和详细信息:c#教程-处理未处理的异常
编辑: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());
}
}
}
LINQPad似乎不仅执行它的查询,而且还在它们自己的AppDomain中加载它的依赖项。如果你在应用程序中创建了一个新的AppDomain,你就可以友好地处理异常,并以友好的方式重新加载/编译应用程序。
更有趣的是LINQPad如何处理它的依赖关系。显然,当加载到这些应用域时,它们是"影子复制"的,因为我有一个自己开发的自定义库,我可以"即时"对其进行更改,而且LINQPad不会锁定文件;相反,它似乎有一个FileSystemWatcher,它查找文件的更改,卸载AppDomain,然后用新的依赖项重新加载AppDomain。
在构建新库之后,应用程序中的"暂停",然后我添加的那些新"方法"现在通过智能感知可用于脚本,这表明LINQPad在处理脚本和引用库时相当智能:a)不仅改变;但是b)可能导致它崩溃。
不过,如果你真的想找点乐子,你总是可以使用System.Diagnostics.Debugger.Break()。如果你在LINQPad属性中关闭对脚本的优化,你可以调试到LINQPad进程中,在Visual Studio调试器窗口中获取源代码,设置断点,逐步执行,检查变量等,以便真正"调试"在LINQPad中创建的代码片段。这是脚本中额外的几行,但如果您在LINQPad中进行一些繁重的脚本编写/测试,那么这是值得的。
这仍然是我所能找到的最好的工具之一,用于原型,单元测试和构建使用LINQ查询的c#代码,我可以直接删除&粘贴到应用程序中,相对容易感觉它们会像观察到的那样运行。