【问题标题】:WPF app early TypeInitializationException catchWPF 应用程序早期 TypeInitializationException 捕获
【发布时间】:2014-06-25 14:42:33
【问题描述】:

我的团队将 WPF 应用程序分发到一千多台机器。 99.9% 的应用程序按预期工作,但是,有时我们会从 C++ 中得到一个异常。通常这是一个非常早期的例外。显然,我们无法访问 Visual Studio 和工具(不过,我可能会分发一些独立的工具)、调试、管理员权限等。在这种情况下,我完全无法依靠猜测。 Windows EventLog 没有多大帮助。 Main() 方法在生成的代码 App.g.i.cs 中,我想是相当标准的。 如何在它周围插入 try/catch?它甚至会提供任何线索吗?显然,主要目标是消除或减少猜测。

public static void Main() {
MyProgram.App app = new MyProgram.App();
app.InitializeComponent();
app.Run();

}

Windows 事件日志中的异常如下:

Application: MyProgram.EXE 

框架版本:v4.0.30319 说明:进程因未处理的异常而终止。 异常信息:System.TypeInitializationException 堆: 在 MyProgram.App.Main()

错误应用程序名称:MyProgram.EXE,版本:2012.9.4.0,时间戳:0x53628262 错误模块名称:KERNELBASE.dll,版本:6.1.7601.18229,时间戳:0x51fb1677 异常代码:0xe0434352 故障偏移量:0x000000000000940d 故障进程ID:0x1b18 错误应用程序启动时间:0x01cf8f6f7c57dd1d 错误的应用程序路径:c:\WritableFolder\MyProgram.EXE 错误模块路径:C:\Windows\system32\KERNELBASE.dll 报告 ID:baa30260-fb62-11e3-b7d9-a0d3c10c1ecc

谢谢(这不是事件日志消息的一部分)

【问题讨论】:

    标签: c# c++ wpf


    【解决方案1】:

    我不是 100% 确定,但您也许可以在 AppDomain.UnhandledException 事件中捕获异常:

        static void Main()
        {
            AppDomain.CurrentDomain.UnhandledException += OnAppDomainUnhandledException;
    
            // ... existing code
        }
    
    
        private void OnAppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // Log exception in more detail (note e.IsTerminating for interest)
        }
    

    当此事件触发时,无法再“处理”它,但它应该让您有机会更详细地记录异常,因为我猜 InnerException 隐藏在那里。

    【讨论】:

    • 感谢您的回复。也许我遗漏了一些东西...... Main() 在生成的代码文件中,将被覆盖。问题的一部分是我如何将任何代码放在那里。如果可以的话,我猜一个简单的 try-catch 就足够了。另一方面,我可以添加处理程序的地方在初始化时为时已晚......
    • 这意味着您应该有一个 App.xaml.cs,您可以在其中覆盖 OnStartUp。也许在致电base.OnStartup()之前订阅那里的活动?
    • 我同意@Stuart,App 类构造函数将是最早订阅该事件的地方。
    【解决方案2】:

    (抱歉没有足够的代表评论安德烈的回答)

    在您的 App.xaml.cs 中将 UnhandledException 处理程序添加到构造函数

    public partial class App
    {
        public App()
        {
            AppDomain.CurrentDomain.UnhandledException += OnAppDomainUnhandledException;
    

    以及记录异常的方法

    private void OnAppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        // Log exception in more detail (note e.IsTerminating for interest)
    }
    

    【讨论】:

    • 嗨 Stuart,谢谢,是的 - 我自己刚刚添加了类似的评论。
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多