【发布时间】:2018-08-05 14:45:12
【问题描述】:
我有一个控制台应用程序,如下所示,
static void Main(string[] args)
{
try
{
System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
// My Code
}
catch(Exception ex)
{
}
}
static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
{
// The code.
}
在上面的代码中,catch 和 UnhandledExceptionTrapper 都没有触发。它突然说应用程序停止工作。事件查看器没有关于崩溃的重要信息。事件查看器说存在一些文件,但是在那里什么都没有检查。我正在使用 .NET 4.6.1。
代码只是从 oracle 中提取数据(使用 dapper)并使用 TransactionScope。
编辑:我们找到了罪魁祸首。它正在对包裹在 TransactionScope 中的 Oracle 进行更新。问题是无法捕获这些异常,并且它有时会出现并且大部分时间都会失败。这些是使用 Dapper 更新 Oracle 的示例代码。
using (var scope = new TransactionScope())
{
UpdateOracleUsingDapperMethod();
scope.Complete();
}
【问题讨论】:
-
这可能与非托管库有关...您在使用吗?
-
不,我正在使用 Dapper 和事务范围
-
在您的 Main() 方法可以运行和订阅事件之前需要发生一堆事情。即时编译器需要首先运行,它很容易因 FileNotFoundException 而失败。在 Release 版本中情况更糟,现在它需要尝试内联方法调用,因此需要 jitted 更多代码。任何带有字段初始值设定项的静态变量都是值得注意的,它们可能会在 Main() 开始执行之前运行并重新启动。通过将
// My Code块中的代码移动到另一个静态方法中来使它变得更好。它需要 [MethodImpl(MethodImplOptions.NoInlining]) 来减缓抖动。 -
@HansPassant 我可以调试前几行代码,但之后就崩溃了
-
有些异常太糟糕了,无法处理和触发故障快速处理。就像这个网站的名字一样,are others。查看进程退出代码的输出窗口。反正有的可以举报,看this Q+A。