【问题标题】:Console Application Crashing, not executing global try catch and UnhandledException控制台应用程序崩溃,未执行全局 try catch 和 UnhandledException
【发布时间】: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();
}

相关:https://github.com/dotnet/runtime/issues/30422

【问题讨论】:

  • 这可能与非托管库有关...您在使用吗?
  • 不,我正在使用 Dapper 和事务范围
  • 在您的 Main() 方法可以运行和订阅事件之前需要发生一堆事情。即时编译器需要首先运行,它很容易因 FileNotFoundException 而失败。在 Release 版本中情况更糟,现在它需要尝试内联方法调用,因此需要 jitted 更多代码。任何带有字段初始值设定项的静态变量都是值得注意的,它们可能会在 Main() 开始执行之前运行并重新启动。通过将// My Code 块中的代码移动到另一个静态方法中来使它变得更好。它需要 [MethodImpl(MethodImplOptions.NoInlining]) 来减缓抖动。
  • @HansPassant 我可以调试前几行代码,但之后就崩溃了
  • 有些异常太糟糕了,无法处理和触发故障快速处理。就像这个网站的名字一样,are others。查看进程退出代码的输出窗口。反正有的可以举报,看this Q+A。

标签: c# .net dapper


【解决方案1】:

我们发现该问题与OleDbConnection 有关。所以,我们搬到了OracleConnection 并且没有崩溃。这意味着在带有TransactionScope 和OleDbConnection 的Dapper 中使用Oracle 会有一些严重的问题。

猜你喜欢
  • 2013-01-15
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2017-07-28
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多