如何修复使用EF 6记录从Interop引发的异常的问题

问题描述 投票:0回答:1

提出如下例外: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();
            }
        }

所以我们可以看到我们正在尝试更新日志记录。记录器类和对象的创建似乎不重要地考虑问题的范围,所以现在让我跳到我们这里得到的东西:

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的东西是独一无二的,我只是不确定是什么。

c# entity-framework com-interop
1个回答
1
投票

这根本与Entity Framework无关。没有。你所指的是如何报告未处理的异常。为了证明它,注释掉你的实体框架逻辑,并观察应用程序仍然会终止,并且“IDE突出显示并打开异常”很可能记录器中没有记录任何内容,因为在使用interop异常时应用程序在写入之前终止任何日志条目。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.