为什么我的捕获块没有捕获?

时间:2011-12-30 23:48:09

标签: c# exception-handling

我有一个非常标准的尝试/捕获没有捕获NullReferenceException。我正在尝试使用.Tag属性从表单返回日期值。此标记通常为null,这很好。我的代码对我来说似乎最简单,但它不会捕获。任何帮助都会很棒,提前谢谢...

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建议:“在Debug-> Exceptions菜单中,您可以选择中断抛出和用户未处理的异常。”

5 个答案:

答案 0 :(得分:7)

这并没有真正回答这个问题,但是:当一个简单的if测试已经足够时,导致异常并捕获它就被认为是不好的做法。编辑:此外,由于异常显然是由于试图将null转换为DateTime(这是一种值类型,我应该看到它 - 感谢评论者,他比我更清醒) ,您需要在投射前检查frmSetTimer.Tag 。请尝试以下方法:

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

这假设即使参数为null,SetDataRunTimer()也没有任何您想要触发的副作用。如果确实如此,那么无论参数是否为null都必须调用它,您应该修改该方法以正常处理null(并且可能返回指示事情是否顺利的bool)或抛出ArgumentNullException。此外,还需要DateTime?才能完全通过null。永远不应该被无错误的代码抛出NullReferenceException,不应该被明确捕获 - 这样,任何NullReferenceException总是表明编程错误。

答案 1 :(得分:2)

你确定在catch块中没有引起空引用异常吗?

答案 2 :(得分:1)

试试这个:

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

编辑:如果这不起作用,请尝试使用调试器查看它是否首先进入“catch”块。

答案 3 :(得分:1)

确保SetDataRunTimer中没有可能“吞下”异常的任何catch块。 Here是一些有用的例外指南。

答案 4 :(得分:1)

我只是好奇为什么你认为它不会扔掉。你有什么期待?你在捕获中设置了一个断点吗?在Debug-> Exceptions菜单中,您可以选择中断抛出和用户未处理的异常。