为什么我的catch不是block catch ?

本文关键字:catch block 不是 为什么 我的 | 更新日期: 2023-09-27 18:19:18

我有一个非常标准的尝试/捕获,没有捕获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();
            }
        }

编辑:根据digingforfire下面的建议解决了这个问题:"在Debug->Exceptions菜单中,你可以选择在抛出的和用户未处理的异常上中断。"

为什么我的catch不是block catch ?

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

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

这里假设SetDataRunTimer()没有任何副作用,即使参数为null也不会触发。如果是这样,那么无论参数是否为空,您都必须调用它,您应该修改该方法以优雅地处理null(并且可能返回指示事情是否进行顺利的bool)或抛出ArgumentNullException。此外,它需要采取DateTime?,以便有可能通过nullNullReferenceException不应该被无bug的代码抛出,也不应该被显式捕获——这样,任何NullReferenceException都是编程错误的指示。

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

试试这个:

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

编辑:如果这不起作用,尝试使用调试器,看看它是否甚至进入你的'catch'块放在首位。

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

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