在你的类中有两个 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)。(方法的重写)

依赖 jar 的类中的自动装配注释

java中怎么import其他路径下的类

在继承的类中覆盖 NSLayoutConstraint

java.lang.InstantiationException: com.lch.commder.entity.Car 已解决

导航到另一个视图 iPhone sdk?