传播回报的最佳方式

Posted

技术标签:

【中文标题】传播回报的最佳方式【英文标题】:Best way to make a return propagate 【发布时间】:2015-04-21 11:54:56 【问题描述】:

我找不到这个问题的答案,可能是因为我没有以正确的方式提出这个问题。

所以,我正在编写一个类内部的方法,并且在某些时候我希望它测试字符串的格式。如果不正确,我希望它向用户显示一条消息,并停止执行,以便用户可以修复该错误。我有这个:

                if (Is not properly formated)
                
                    //get error information

                    //show error box with the formation error line
                    MessageBox.Show(String.Format(
                        "Error message0",
                        errorLine.ToString()), "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    return; 
                

当然这样会停止这个方法的执行,但是我想停止main方法的执行(一个按钮点击方法)。

在 C# 中执行此操作的最佳方法是什么?

【问题讨论】:

没有多级退货。你可以抛出 Exception... 但我不建议这样做 您可以返回一个布尔值或整数,然后检查按钮单击方法中的值。 你为什么不认为一个例外可能是好的?太激进了?我虽然想返回一个值,但是如果这个特定的方法被埋在另一个,另一个,另一个里面怎么办?每一个都要返回一个值,难道没有更简洁的方法吗? 【参考方案1】:

你真的应该在 C# 中使用异常,例如

private void Calculate(string[] lines)

    try
    
        lines.ForEach(Validate);

        // process lines
    
    catch(InvalidArgumentException ex)
    
        MessageBox.Show(...);
       


private void Validate(string s)

    if(s.IsNullOrEmpty)
        throw new InvalidArgumentException(/* some details here*/);

【讨论】:

抛出异常应该反映一个不应该发生的状态。我认为返回一个布尔值会是一个更好的方法。没有? @ScottNimrod 我正在尝试遵循防御性编程。用户不应该输入:'); drop table payrol; --,但他们会输入【参考方案2】:

您可以编写一个验证方法,如果该值有效则返回 true,并可选择返回 string 告诉错误:

private bool Validate(string s, out string error)

    if (string.IsNullOrEmpty(s))
    
        error = "s is null";
        return false;
    
    else
    
        error = null;
        return true;
    

然后调用它:

string error;
if (!Validate(null, out error))

    MessageBox.Show(error);

    // Do something

如果您想构建可能的错误列表,您可以使用enum 而不是string

【讨论】:

当然可以,但是如果我的方法在其他方法和其他方法中执行怎么办?每个调用方法都必须测试错误以使返回传播到最后一个调用方法,以便停止执行(按钮单击方法)。我认为这很快就会变得很烦人,不是吗? 您可以选择将验证与执行的其余部分分开。 其他答案中的例外情况可能会有所帮助。

以上是关于传播回报的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 中的线程上传播 tcplistener 传入连接?

Spring事务使用最佳实践

Spring事务使用最佳实践

Spring事务使用最佳实践

Spring事务使用最佳实践

将权限传播到 Javascript