Проблема с исключением возникла без аргумента - PullRequest
1 голос
/ 08 апреля 2011

Обнаружена странная проблема с этим событием, оболочкой и обработчиком событий:

public delegate void StatusUpdateHandler(string message, Exception exc, SeverityLevel severity);

public event StatusUpdateHandler StatusUpdate;

private void FireStatusUpdate(string message)
{
    if (this.StatusUpdate != null)
        this.StatusUpdate(message, null, SeverityLevel.None);
}

void scanDocProcessor_StatusUpdate(string message, Exception exc, SeverityLevel severity)
{
    try
    {
        if (exc != null)
        {
            if (severity >= setSevLevel)
                this._logger.Log(message + Environment.NewLine + exc.ToString(), LogEntryType.Emergency, "OCR Submission Processor Status Update", true);
            else
                this._logger.Log(message + Environment.NewLine + exc.ToString(), LogEntryType.Error, "OCR Submission Processor Status Update", false);
        }
        else if (severity >= setSevLevel)
        {
            this._logger.Log(message, LogEntryType.Info, "OCR Submission Processor Status Update", true, true);
        }
        else
            this._logger.Log(message, LogEntryType.Info, "OCR Submission Processor Status Update", false);
    }
    catch (Exception)
    {
        EventLog.WriteEntry("Russia OCR Submission Processor", "Could not log status update event: " + exc.ToString(), EventLogEntryType.Information);
    }
}

В течение нескольких минут _logger прекратил регистрировать сообщения, и вместо этого я получил эти сообщения в журнале событий:

Не удалось записать событие обновления состояния: System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта. в ScannedService.scanDocProcessor_StatusUpdate (строковое сообщение, исключение исключение, серьезность SeverityLevel) в ScannedService.Processor.FireStatusUpdate (строковое сообщение) в ScannedService.Processor.ProcessQueue (Object Object)

Я запутался, как журнал событий мог получить такую ​​трассировку стека, когда он должен писать exc.ToString (). Я посмотрел на IL для метода scanDocProcessor_StatusUpdate, который не инициализирует объект Exception. Кроме того, я не знаю, как возникает исключение nullreference. Когда метод Log перехватывает исключение, он проглатывает его или перебрасывает с помощью команды throw; Параметр сообщения никогда не является нулевым, а SeverityLevel является перечислением.

1 Ответ

0 голосов
/ 08 апреля 2011

Вы вызываете исключение в одном из условий else, где ecx равно нулю.В блоке catch вы предполагаете, что ecx не равно нулю, что генерирует еще одно исключение, которое скрывает ваше исходное.

Вы можете сделать вашу инструкцию журнала безопасной с помощьюследующее:

EventLog.WriteEntry("Russia OCR Submission Processor", 
    String.Format("Could not log status update event: {0}", exc), EventLogEntryType.Information);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...