【问题标题】:How to continue execution after exceptions?异常后如何继续执行?
【发布时间】:2018-03-09 01:30:55
【问题描述】:

我正在使用 API 访问网站(如交易所)上的只读数据,以获取代码/价格。它工作得很好,但有时当我让应用程序运行时,会抛出一个异常,如“TaskCanceledException”。

我怎样才能安全地忽略这些并继续执行相同的功能?

因为如果函数调用失败,没有什么不好的事情发生,因为我只是显示价格,所以它可以跳过一些函数调用而不会给用户带来任何问题。

我必须这样做吗?

try
{
    this.UpdateFields ( );
}
catch ( Exception ex )
{
    Console.WriteLine ( ex );
    Console.WriteLine ( "Continue" );
    this.UpdateFields ( );
}

对于每一个异常事件都以此类推?

【问题讨论】:

  • try ... catch 放入方法本身怎么样?
  • 你想做什么?如果出现错误,您要重试吗?
  • 谢谢我不知道我是否尝试过,我会这样做,所以我希望它不会被重新扔回给调用者。
  • @CodingYoshi 基本上是的,因为这个函数是在 BG worker 中使用计时器调用的。

标签: c# .net exception exception-handling try-catch


【解决方案1】:

我相信更明智的方法是在 UpdateFields 函数中捕获异常。

我假设函数遍历每个字段,并在执行过程中进行更新,并且在该循环中应该捕获它。

    private void UpdateFields()
    {

        foreach (var field in fields)
        {
            try
            {
                // Update a field
            }
            catch (TaskCanceledException ex)
            {
                Console.WriteLine(ex);
                // Control flow automatically continues to next iteration
            }

        }
    }

【讨论】:

  • 为什么要抓TaskCanceledException
  • 这只是 OP 声明他们试图忽略的异常的一个例子。
  • @CodingYoshi:我同意。如果 OP 只想记录和吞下特定类型的异常,并确保在该异常类型上设置了特定属性,该怎么办。
【解决方案2】:

我在评论中问过你:

你想做什么?如果出现错误,您要重试吗?

你回答:

@CodingYoshi 基本上是的,因为这个函数是在 BG worker 中使用计时器调用的。

如果您使用计时器调用它,那么只需下面的代码就足够了,因为计时器会再次调用它:

try
{
    this.UpdateFields();
}
catch (Exception e)
{
    // Either log the error or do something with the error
}

如果你没有使用计时器但你想继续尝试,你可以像这样在循环中这样做:

bool keepTrying = true;
while (keepTrying)
{
    try
    {
        this.UpdateFields();
    }
    catch (Exception e)
    {
        // Either log the error or set keepTrying = false to stop trying
    }
}

如果您想尝试x 次数然后放弃,请将while 循环更改为for 循环。

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多