如何解决使用 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 块和一些日志记录。
抛出如下异常: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 块和一些日志记录。