传播回报的最佳方式
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
。
【讨论】:
当然可以,但是如果我的方法在其他方法和其他方法中执行怎么办?每个调用方法都必须测试错误以使返回传播到最后一个调用方法,以便停止执行(按钮单击方法)。我认为这很快就会变得很烦人,不是吗? 您可以选择将验证与执行的其余部分分开。 其他答案中的例外情况可能会有所帮助。以上是关于传播回报的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章