LINQPad和未处理的异常

时间:2011-09-22 15:21:31

标签: c# linqpad

我正在尝试使用以下C#语句来崩溃LINQPad4:

new Thread(() => new Thread(() => { throw new Exception(); }).Start()).Start();

显示未处理的异常对话框,但该过程不会消失。我想IsTerminating = true就像在所有UnhandledThreadExceptions中一样......它是如何阻止进程死亡的?

2 个答案:

答案 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查询。以相对容易的感觉粘贴到应用程序中,它们的行为与观察到的一样。