Как решить проблему с использованием EF 6 для регистрации исключений, возникающих при взаимодействии - PullRequest
0 голосов
/ 15 апреля 2019

Исключение возникает следующим образом: 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();
            }
        }

Итак, мы видим, что мы пытаемся обновить запись в журнале. Класс logger и создание объекта кажутся неважными при рассмотрении объема вопроса, поэтому позвольте мне теперь перейти к тому, что нас здесь привело:

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 является уникальным, я просто не уверен, что.

1 Ответ

1 голос
/ 16 апреля 2019

Это никак не связано с Entity Framework. Ничего такого. То, что вы имеете в виду, это то, как сообщается о необработанном исключении. Чтобы доказать это, закомментируйте логику вашей структуры сущностей и обратите внимание, что приложение все еще будет завершено, а «среда IDE выделяет и открывает исключение». Вполне вероятно, что в вашем логгере ничего не зарегистрировано, потому что, за исключением взаимодействия, приложение завершает работу, прежде чем записывает какие-либо записи журнала.

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

Вам нужен блок try catch и ведение журнала, если вы хотите обработать ошибку.

...