我想按指定的时间间隔(例如3秒)调用一次方法,但是我在调用方法(例如Start)抛出的异常中遇到了异常,被调用的方法抛出(timer_Elapsed)
更新
public void Start()
{
Timer timer = new Timer(PingPeriod); //System.Timers
try
{
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
catch (Exception ex)
{
//I want to catch exception thrown by timer_Elapsed
}
//Logic here that keeps the method running
}
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
throw new exception("Catch this exception please");
}
更新
任何人都可以确认start()不会捕获从timer_Elapsed抛出的异常,或者在异常发生时尝试调用timer_Elapsed。
是否有更好的替代方案,可以从被调用方法中捕获异常或获得通知?
任何想法都会非常感激!
答案 0 :(得分:2)
这是不可能的,Elapsed事件处理程序稍后运行 ,就在您的Start()方法退出之后。此外,该事件具有吞咽所有例外的恶习,而无需任何诊断。
您需要在事件处理程序中处理异常。当然不容易做到。请考虑使用System.Threading.Timer类。至少你的程序会在回调引发异常时终止。
答案 1 :(得分:0)
这是不可能的,因为异常是在与设置计时器的执行上下文(线程)不同的执行上下文(线程)上抛出的。
您应该在回调方法中处理任何异常。如果您希望将逻辑与异常处理分开,只需创建一个单独的方法。
private void TimerElapsedCallback(object sender, ElapsedEventArgs e)
{
try
{
this.DoSomething();
}
catch (Exception ex)
{
// handle
}
}
private void DoSomething()
{
// logic goes here and can be agnostic of any exceptions it throws, if desired
}