在你的类中有两个 System.Timer.Timer 对象并捕获异常
Posted
技术标签:
【中文标题】在你的类中有两个 System.Timer.Timer 对象并捕获异常【英文标题】:Having two System.Timer.Timer objects in your class and catching exceptions 【发布时间】:2016-05-07 01:21:57 【问题描述】:我有一个包含两个 System.Timers.Timer
对象的类。我现在看到的是,一个抛出的异常被另一个捕获。这是正确的行为吗?
class MyClass
System.Timers.Timer tOne;
System.Timers.Timer tTwo;
tOne.Elapsed += new System.Timers.ElapsedEventHandler(one);
tTwo.Elapsed += new System.Timers.ElapsedEventHandler(two);
void one(object sender, System.Timers.ElapsedEventArgs e)
try
.. some code that throws ...
catch (Exception)
// not caught here
void two(object sender, System.Timers.ElapsedEventArgs e)
try
catch (Exception)
// but caught here
【问题讨论】:
你最好在单独的线程中运行你的计时器 你能发一个mvce吗?你所声称的是不可能的。如果您的两个计时器都引用同一个实例,那么这是可能的(如果您在第一个处理程序中没有 try/catch 块)。 @SriramSakthivel 这就是我问的原因。我看到我的代码中发生了奇怪的事情。恐怕 MVCE 会很难。 @SriramSakthivel 如果我打破抛出的异常并检查堆栈,则不会提及错误实际发生的位置。 奇怪!。抛出异常时中断应该停止在发生异常的确切行。当然,当一些本机代码抛出意外异常时,VS 会感到困惑。是这样吗? 【参考方案1】:不同的定时器,但是异常被抛出异常后ticks
的第一个定时器捕获。你的问题主要是因为你使用了单
线程。
System.Timers.Timer
将默默吞下异常并继续计时器(尽管这可能会在框架的未来版本中发生变化); System.Threading.Timer
将终止程序。
【讨论】:
我相信你误解了这个问题。 他问这是否是正确的行为。在这种情况下,从我所看到的情况来看是正确的,因为每个计时器都有自己的线程,因此,它调用了自己的方法。异常被其他计时器捕获,您有多线程并且没有其他同步机制。以上是关于在你的类中有两个 System.Timer.Timer 对象并捕获异常的主要内容,如果未能解决你的问题,请参考以下文章
写一个怪物的类,类中有属性姓名(name),攻击力(attack),有打人的方法(fight)。(方法的重写)
java.lang.InstantiationException: com.lch.commder.entity.Car 已解决