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

时间:2016-05-04 03:38:16

标签: c# .net

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

应用程序间歇性地返回退出代码-532462766(0xE0434352),这是.NET未处理异常的一般错误代码。我完全不知道为什么会发生这种情况。

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

Application Event Viewer日志中没有条目。

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

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应用程序返回退出代码吗?我在故障排除中遗漏了什么吗?

2 个答案:

答案 0 :(得分:2)

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

static int Main(string[] args)
{
    try
    {

          //your existing code....

    }
    catch(Exception Ex)
    {
        //write your log results here.

    }
}

答案 1 :(得分:0)

检查您是否使用多个应用域。当在AppDomain B中抛出异常X并且无法交叉到AppDomain A时,我遇到了同样的问题,因为它不可序列化。另请参阅best practices for exceptions(搜索“跨应用领域”):

  

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

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

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