如何拦截“无法加载文件或程序集”错误?

3
在测试一款基于命令行的程序时,我故意从执行目录中删除了一个DLL文件。当程序启动时,这当然会导致“无法加载文件或程序集”异常触发,并将原始异常细节转储到命令行上:
未处理的异常: System.IO.FileNotFoundException: 无法加载文件或程序集'MyDLL,Version=1.2.3.14056,Culture=neutral,PublicKeyToken=0a0932194e205074'或其中之一的依赖项。系统找不到指定的文件。 在MyApp.Program.Program.Main(String[] args)处
我不想让用户看到这些原始细节,但我看不到如何/在哪里捕获此异常以清理呈现的消息。
那么,最佳/公认的方法是如何捕捉这样的异常?

1
使用 ex.Message 可以吗? - apomene
1
尝试查找全局的UnhandledException事件了吗?我曾经认为它在AppDomain.CurrentDomain中,你或许可以在那里处理异常。这只是我的一些想法。 - Silvermind
2
也许使用AppDomain.CurrentDomain.UnhandledException事件是解决方案?以捕获所有未处理的异常并以适当的方式显示它们的消息? - Dmitry Bychenko
1个回答

3

您可以注册未处理异常处理程序并按如下方式进行处理:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler((x, y) =>
{
    var exception = y.ExceptionObject as Exception;

    if (exception is System.IO.FileNotFoundException)
        Console.WriteLine("Please make sure the DLL is in the same folder.");
});

确保在您的代码中任何对 MyDLL 的引用之前执行此事件注册。在 Program.cs 中使用静态构造函数可能是一个不错的选择。


我把你的代码复制到了 static Program() 中,虽然它能够构建,但我仍然得到了相同的响应。但我将尝试使用不同的构建再次尝试。作为一个命令行应用程序,有可能我没有运行事件队列吗? - Peter M
1
当我添加了 var sender = x as object 到你的代码中,它就起作用了。我缺失的主要技巧是为 Program 创建一个静态构造函数! - Peter M
@PeterM,你能更好地解释一下“为程序创建静态构造函数”是什么意思吗?你实际上做了什么? - Alessandro Martinelli
由于静态构造函数在类的任何实例创建之前执行其代码,因此它将在最早可能的时刻注册到上述事件。您可以谷歌“静态构造函数”以获取有关语法的更多信息。 - Omer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接