Почему мой улов не ловит? - PullRequest
1 голос
/ 31 декабря 2011

У меня есть очень стандартная попытка поймать, которая не перехватывает исключение NullReferenceException.Я пытаюсь вернуть значение даты из формы, используя свойство .Tag.Этот тег часто будет нулевым, и это нормально.Мой код ниже кажется мне самым простым, но он не поймает.Любая помощь будет отличной, заранее спасибо ...

public void ScheduleDataRun()
        {
            FrmSetTimer frmSetTimer = new FrmSetTimer(DateTimeOfNextAvailableDataRun);

            try
            {
                frmSetTimer.ShowDialog();
                DateTimeOfNextScheduledDataRun = (DateTime)frmSetTimer.Tag;
                SetDataRunTimer(DateTimeOfNextScheduledDataRun);
                Status = DRMStatus.Scheduled;
            }
            catch
            {
                Status = DRMStatus.Inactive;
                StatusChanged();
            }
        }

Редактировать: проблема решена в соответствии с предложением Diggingforfire, приведенным ниже: «В меню« Отладка-> Исключения »вы ​​можете разбить выброшенные и необработанные пользователем исключения. "

Ответы [ 5 ]

7 голосов
/ 31 декабря 2011

Это не совсем ответ на вопрос, но: вызывать исключение и перехватывать его считается плохой практикой, когда простого теста if было бы достаточно. Изменить: Кроме того, поскольку исключение, по-видимому, вызвано попыткой привести null к DateTime (это тип значения, который я должен был увидеть - благодаря комментаторам, которые были более бодрыми, чем я), вам необходимо проверьте frmSetTimer.Tag перед кастингом. Попробуйте следующее:

frmSetTimer.ShowDialog();
if (frmSetTimer.Tag == null) {
   Status = DRMStatus.Inactive;
   StatusChanged();
}
else {
   SetDataRunTimer((DateTime)frmSetTimer.Tag);
   Status = DRMStatus.Scheduled;
}

Предполагается, что SetDataRunTimer() не имеет побочных эффектов, которые вы хотели бы вызвать, даже если аргумент нулевой. Если это так, то вам нужно вызывать его независимо от того, является ли аргумент нулевым или нет, вы должны изменить этот метод, чтобы либо обрабатывать ноль изящно (и, возможно, возвращать bool, который указывает, хорошо ли все прошло, либо нет), или выдает ArgumentNullException. Кроме того, потребуется DateTime?, чтобы вообще можно было пройти null. NullReferenceException никогда не должен генерироваться безошибочным кодом и не должен быть явно перехвачен - таким образом, любой NullReferenceException всегда указывает на ошибку программирования.

2 голосов
/ 31 декабря 2011

Вы уверены, что в блоке catch не вызывается исключение нулевой ссылки?

1 голос
/ 31 декабря 2011

Мне просто любопытно, почему вы думаете, что это не бросок. Что вы ожидаете? Вы установили точку останова в улове? В меню «Отладка-> Исключения» вы можете разбить выброшенные и необработанные пользователем исключения.

1 голос
/ 31 декабря 2011

Убедитесь, что внутри SetDataRunTimer нет блоков перехвата, которые могли бы «проглотить» исключение. Здесь - несколько полезных рекомендаций по исключениям.

1 голос
/ 31 декабря 2011

Попробуйте это:

   try
    {
        frmSetTimer.ShowDialog();
        DateTimeOfNextScheduledDataRun = (DateTime)frmSetTimer.Tag;
        SetDataRunTimer(DateTimeOfNextScheduledDataRun);
        Status = DRMStatus.Scheduled;
    }
    catch (NullReferenceException)
    {
        Status = DRMStatus.Inactive;
        StatusChanged();
    }

РЕДАКТИРОВАТЬ: Если это не сработает, попробуйте использовать отладчик, чтобы увидеть, входит ли он вообще в ваш блок 'catch'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...