![](/img/trans.png)
[英]Why isn't my try/catch block catching System.AggregateException?
[英]Why isn't my catch block catching?
我有一个非常便宜的try / 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();
}
}
编辑:根据下面的Diggingforfire建议解决的问题:“在Debug-> Exceptions菜单中,您可以选择中断抛出的异常和用户未处理的异常。”
这实际上不是在回答问题,而是: if
简单的if
测试就足够了, 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
绝不应该被没有bug的代码抛出,也不应该被明确捕获-这样,任何NullReferenceException
总是表示编程错误。
您确定在catch块中没有引起空引用异常吗?
尝试这个:
try
{
frmSetTimer.ShowDialog();
DateTimeOfNextScheduledDataRun = (DateTime)frmSetTimer.Tag;
SetDataRunTimer(DateTimeOfNextScheduledDataRun);
Status = DRMStatus.Scheduled;
}
catch (NullReferenceException)
{
Status = DRMStatus.Inactive;
StatusChanged();
}
编辑:如果这不起作用,请尝试使用调试器查看它是否甚至首先进入了您的“ catch”块。
确保SetDataRunTimer中没有任何捕获块可以“吞噬”异常。 这是一些有用的例外准则。
我很好奇为什么您认为它没有抛出。 你在期待什么? 您是否在捕获中设置了断点? 在Debug-> Exceptions菜单中,您可以选择中断引发的异常和用户未处理的异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.