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菜单中,您可以选择中断抛出和用户未处理的异常."
这并没有真正回答这个问题,但是:当一个简单的if测试已经足够时,导致异常并捕获它就被认为是不好的做法.编辑:此外,由于异常显然是由于试图转换null为DateTime(这是一种值类型,我应该看到 - 感谢评论者,谁比我更清醒),你需要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无错误的代码抛出,不应该被明确捕获 - 这样,任何东西都是编程错误的指示.