【问题标题】:LINQPad and unhandled exceptionsLINQPad 和未处理的异常
【发布时间】:2011-10-21 10:54:12
【问题描述】:

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

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

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

【问题讨论】:

  • 对不起,我忍不住了。 为什么你要这样做?
  • 哈。试图在我的一个应用程序上添加相同的功能。 :P
  • 我知道。用户确实会尝试故意使程序崩溃。 -)
  • 仅在有用时:p
  • 只是不要尝试抛出 StackOverflowException - CLR 会阻止你捕获这个!

标签: c# linqpad


【解决方案1】:

它也有一个针对所有非 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());
        }
    }
}

【讨论】:

  • 但未处理的线程异常总是会终止应用程序。 LINQPad 如何忽略那部分?
  • 它不是未处理的,它在线程内部未处理,但 LINQPad 正确处理它。
  • 只要确保我做对了。这可行,但如果我创建另一个 AppDomain,它会崩溃 - 对吧? (除非我将处理程序添加到该 AppDomain,否则。)
  • LINQPad 的 app.config 包括 - 这允许在应用程序随后不死的情况下处理线程异常。
  • 哇。谢谢你……还有 LINQPad
【解决方案2】:

LINQPad 似乎不仅执行它的查询,而且还在它们自己的 AppDomain 中加载它的依赖项。如果您在应用程序中创建新的 AppDomain,您可以以友好的方式处理异常并以友好的方式重新加载/编译应用程序。

更有趣的是 LINQPad 如何处理它的依赖关系。显然,当它们被加载到这些 AppDomain 中时,它们是“影子复制”的,因为我有一个我开发的自定义库,我可以“即时”对其进行更改,并且 LINQPad 不会锁定文件;相反,它似乎有一个 FileSystemWatcher 来查找文件的更改,卸载 AppDomain,然后使用新的依赖项重新加载 AppDomain。

构建新库后应用程序中的“暂停”,然后我添加的那些新“方法”现在可通过智能感知用于脚本,这表明 LINQPad 在处理脚本和引用的库时相当智能:a)不仅改变;但是 b) 可能会导致它崩溃。

但是,如果您真的想玩得开心,您可以随时使用 System.Diagnostics.Debugger.Break()。如果您在 LINQPad 属性中关闭脚本优化,您实际上可以调试到 LINQPad 进程,在 Visual Studio 调试器窗口中获取源代码,放置断点,单步执行,检查变量等,以便真正“调试” ' 你在 LINQPad 中创建的代码 sn-ps。这是脚本中的几行额外代码,但如果您在 LINQPad 中执行一些繁重的脚本/测试,则非常值得。

这仍然是我能找到的最好的工具之一,用于原型、单元测试和构建使用 LINQ 查询的 C# 代码,我可以将其剪切并粘贴到应用程序中,相对容易感觉它们的行为与观察到的一样.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多