来自的意外退出代码.NET控制台应用程序



我已经编写了一个控制台应用程序和一个配套类库,用于从云服务导出一些数据。该应用程序由SQL Server Integration Services调用,该服务依赖于应用程序返回的退出代码来确定它是否正常工作。

应用程序间歇性地返回-532462766(0xE0434352)的退出代码,这是的通用错误代码。NET未处理的异常。我完全弄不明白为什么会发生这种事。

应用程序生成的日志文件没有显示任何问题,看起来一切都已成功完成。

应用程序事件查看器日志中没有条目。

应用程序甚至有一个未处理的异常处理程序:

AppDomain.CurrentDomain.UnhandledException += UnhandledErrorHandler;
...
private void UnhandledErrorHandler(object sender, UnhandledExceptionEventArgs e) {
    logWriter.Write(e.ExceptionObject.ToString(), logLevel.Fatal);
    logWriter.Write("Exiting now...", logLevel.Fatal);
    Dispose();
}

我甚至编写了一个批处理文件来执行应用程序,并在将退出代码传递给SSIS之前记录它。SSIS正在接收的退出代码似乎是由应用程序返回的。但我看不到任何地方会发生未经处理的异常。

控制台应用程序通过如下定义Main()返回退出代码:

class Program {
    static int Main(string[] args) {
    ...
    return (Success) ? 0 : 1;
}

因为它是间歇性的(数据提取可能需要几个小时),我不能只在Visual Studio中运行并调试它。我怀疑这可能与应用程序运行这么长时间有关,但我似乎无法证实这一点。

还有什么其他原因会导致。NET应用程序返回退出代码?我在故障排除中遗漏了什么吗?

快速检查:将整个代码封装在try-catch块中,并将异常保存在日志文件中。

static int Main(string[] args)
{
    try
    {
          //your existing code....
    }
    catch(Exception Ex)
    {
        //write your log results here.
    }
}

检查您是否正在使用多个应用程序域。当在AppDomain B中引发异常X时,我遇到了同样的问题,因为它不可序列化,所以无法跨到AppDomain A。另请参阅异常的最佳实践(搜索"跨应用程序域"):

创建用户定义的异常时,必须确保异常的元数据可用于正在执行的代码远程,包括跨应用程序域发生异常时。对于例如,假设应用程序域A创建应用程序域B,该应用程序域执行引发异常的代码。应用程序域A正确捕获和处理异常时,它必须能够找到包含应用域B引发的异常。如果应用域B抛出包含在其应用程序下的程序集中的异常基础,但不在应用域A的应用基础下,应用域A将无法找到异常,并且公共语言运行库将引发FileNotFoundException异常。为了避免这种情况,可以在中部署包含异常信息的程序集两种方式:

  • 将程序集放入由共享的公共应用程序库两个应用程序域

  • 如果域不共享通用应用程序库,请使用强名称对包含异常信息的程序集进行签名并将该程序集部署到全局程序集缓存中

最新更新