异常吞噬问题一则
程序员文章站
2022-09-28 10:13:16
问题 在一个 Timer 时钟的周期方法内,有一个 循环,当执行到某些特定的语句时,会从头开始执行,而不会执行后续的语句。 分析 该问题我在初步分析之后,发现可能是由于程序出现了异常,但是被吞噬掉造成的。在我某一个 item 元素当中,其值为 应该会抛出空异常。但是没有异常抛出,后续我不知道哪个地方 ......
问题
在一个 timer 时钟的周期方法内,有一个 foreach
循环,当执行到某些特定的语句时,会从头开始执行,而不会执行后续的语句。
分析
该问题我在初步分析之后,发现可能是由于程序出现了异常,但是被吞噬掉造成的。在我某一个 item 元素当中,其值为 null
应该会抛出空异常。但是没有异常抛出,后续我不知道哪个地方吞噬了异常,就在循环体内增加了一个 if
语句过滤掉了 null
元素。
不过之后仍然会出现最开始所说的问题,看来还有其他的地方在抛出异常,最后排查到是执行 devexpress 图表控件的 begindataupdate()
和 enddataupdate()
之后就会出现上述症状。
查阅了我的 timer
是参照 abp 实现的一个 timer
,找到调用回调方法的地方,发现是我自己将异常捕获并将其忽略掉了。
private void timercallback(object state) { lock (_tasktimer) { if (!_running || _performingtasks) { return; } _tasktimer.change(timeout.infinite, timeout.infinite); _performingtasks = true; } try { elapsed?.invoke(this, new eventargs()); } catch { // ignored } finally { lock (_tasktimer) { _performingtasks = false; if (_running) { _tasktimer.change(period, timeout.infinite); } monitor.pulse(_tasktimer); } } }
根据上图来看,确实是我回调方法中的代码抛出了异常,导致后台任务重新执行。
解决
将跨线程访问语句修复之后,程序运行正常,后面我也在 catch 语句块里面增加了异常日志写入,成功解决问题。
推荐阅读
-
如何解决搜狐影音播放“画面卡”或提示“网络连接异常”的问题?
-
vue 表单输入格式化中文输入法异常问题
-
mysql主从同步导致数据同步异常的问题梳理
-
记一次EF Core DBContext在Action委托中GC异常的问题.
-
VS2010运行Silverlight时无法抛出异常的问题
-
有关ajax的error与后台的异常问题解决
-
声卡驱动问题引起语音聊天异常的原因以及解决办法
-
C#解决SQlite并发异常问题的方法(使用读写锁)
-
用驱动人生解决由声卡驱动问题引起语音聊天异常
-
mybatis oracle proc 数据库测试没问题,java调用就异常 ORA-00900: 无效 SQL 语句