如何解决使用 EF 6 记录互操作引发的异常的问题

How to Fix Issue with Using EF 6 To Log Exception Raised From Interop

抛出如下异常:System.Runtime.InteropServices.COMException: 'The RPC server is unavailable

使用 EF 记录异常如下所示:

LogRecord.LogMessage = Message; db.SaveChanges();

当 SaveChanges 为 运行 时,它不记录任何内容,并且 IDE 跳转到异常并突出显示它。应用程序正确记录并随后按预期退出的任何其他类型的异常。

是否有关于 Interopservices.COMExceptions 和 EF 的信息?

使用 EF 的日志记录方法完美无缺。正是这种特殊类型的异常。

让我们看一个相当基本的数据库记录器示例,特别是日志助手:

  public static void UpdateExecutionLog(int Id, string Message)
        {
            using (var db = new LoggerAutomationEntities())
            {
                var LogRecord = db.LogsTable.Find(ExecutionId);
                LogRecord.LogMessage = Message;
                db.SaveChanges();
            }
        }

所以我们可以看到我们正在尝试更新日志记录。 考虑到问题的范围,记录器 class 和对象的创建似乎并不重要,所以现在让我跳到是什么让我们来到这里:

CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args)
{
//call to write to the log
}

所以任何未处理的异常都会在这里结束。

现在,转换异常、被零除异常等都可以通过这种方式很好地处理,并相应地记录下来。但是,任何 COMException 都会产生问题。

在故意引起的 COMException 中单步执行,我看到所有这些行都被命中:

using (var db = new LoggerAutomationEntities())
                {
                    var LogRecord = db.LogsTable.Find(ExecutionId);
                    LogRecord.LogMessage = Message;
                    db.SaveChanges();
                }

但是,一旦退出,IDE 会突出显示并打开异常,就好像日志处理从未发生过,并且日志记录永远不会进入数据库。这让我得出结论,带有 COMExceptions 的东西是独一无二的,我只是不确定是什么。

这与Entity Framework完全无关。没有什么。您指的是如何报告未处理的异常。为了证明这一点,请注释掉您的 entity framework 逻辑,并观察应用程序仍将终止,并且 "the IDE highlights and opens the exception" 您的记录器中可能没有记录任何内容,因为由于互操作异常,应用程序在写入任何日志条目之前终止。

CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args)
{
    // is not a guarantee that the error is handled.
}

如果您想实际处理错误,您需要一个 try catch 块和一些日志记录。