和未处理的异常

本文关键字:异常 未处理 | 更新日期: 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#代码,我可以直接删除&粘贴到应用程序中,相对容易感觉它们会像观察到的那样运行。