我有一个非常标准的尝试/捕获没有捕获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菜单中,您可以选择中断抛出和用户未处理的异常。”
答案 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菜单中,您可以选择中断抛出和用户未处理的异常。