我编写了一个控制台应用程序和一个配套类库,用于从云服务中导出一些数据。该应用程序由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应用程序返回退出代码吗?我在故障排除中遗漏了什么吗?
答案 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异常。为了避免这种情况, 您可以部署包含异常信息的程序集 两种方式:
- 将程序集放入共享的公共应用程序库中 两个应用领域。
或
- 如果域不共享公共应用程序库,请使用强名称对包含异常信息的程序集进行签名 并将程序集部署到全局程序集缓存中。