加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 中断长时间运行的方法模式

发布时间:2020-12-15 23:34:12 所属栏目:百科 来源:网络整理
导读:我目前正在使用这种有点乏味的模式为用户运行一些长操作生成错误消息: string _problem;void SomeLongRunningMethod(){ try { _problem = "Method1 had problem"; Method1(); _problem = "Unexpected error during doing something in Method2"; if(Method2
我目前正在使用这种有点乏味的模式为用户运行一些长操作生成错误消息:

string _problem;

void SomeLongRunningMethod()
{
    try
    {
        _problem = "Method1 had problem";
        Method1();
        _problem = "Unexpected error during doing something in Method2";
        if(Method2())
        {
            _problem = "Method3 fails";
            Method3();
        }
        _problem = "Not possible to obtain data";
        var somedata = Method4();
    }
    catch(Exception)
    {
        MessageBox.Show("Problem with some long running method: " + _problem);
    }
}

任何一种方法都可能抛出,我想告诉用户哪一步发生故障.这是通过在运行任何一个之前设置_problem来完成的.

在某些情况下,我可以使用不同的异常类型来捕获,但这并不总是有效,例如Method1和Method2都可以抛出InvalidOperationException().

这个重复的代码看起来像一个模式.虽然我无法认出来.有任何想法吗?如何提高可读性?

解决方法

您可以在catch中使用when来区分相同的异常类型并检查哪个方法引发了此异常:

void SomeLongRunningMethod()
{
    try
    {
        Method1();
        if (Method2())
        {
            Method3();
        }
        var somedata = Method4();
    }
    catch (InvalidOperationException invEx) when (invEx.TargetSite?.Name == nameof(Method1))
    {
        // ...
    }
    catch (InvalidOperationException invEx) when (invEx.TargetSite?.Name == nameof(Method2))
    {
        // ...
    }
    catch (Exception ex)
    {
        // ...
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读