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

Sta*_*Csh 1 c# exception-handling

我有一个非常标准的尝试/ catch没有捕获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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

编辑:根据下面的Diggingforfire建议解决问题:"在Debug-> Exceptions菜单中,您可以选择中断抛出和用户未处理的异常."

Aas*_*set 7

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

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

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