使用异常与返回字符串作为消息
本文关键字:消息 字符串 返回 异常 | 更新日期: 2023-09-27 18:37:01
如果我正在编写一个从字符串中解析的 int 的 API,那么将 parse 方法与使用"out"值执行某些操作的方法分开是个好主意吗?
我认为是的原因是代码会更清晰。 例如,如果我收到与解析相关的异常,我可以在堆栈中说"啊,是的,这显然是名为 Parse() 的顶级方法!我相信 null 是错误的选择,因为它可能会引入其他不了解所做技术决策的开发人员的错误(尽管我虔诚地记录了这一点)。
但是,在堆栈中 5 级深的方法中,如何"中继"错误字符串消息?
谢谢
为了中继错误字符串消息,请创建一个异常并使用"throw"关键字。
至于分离解析方法,这是你要的吗?
int myInt;
if(!Int32.TryParse(inputString, out int myInt))
throw new System.ArgumentException("Invalid Argument", "inputString");
methodThatUsesInt(myInt);
你应该让它抛出一个 ArgumentException。
你的问题有点不清楚。 你是说你的方法接受一个字符串,它应该可以解析为整数,然后对这种解析的数字结果做一些事情?
如果您的方法不太可能被馈送大量无效字符串,并且如果您的例程在收到无效字符串时没有任何有用的操作,则您的方法最好在传入无效字符串时引发异常。 如果您的方法执行足够复杂的解析,以至于调用方无法很好地验证字符串,而无需执行例程将要分析的那么多工作,并且您的例程需要处理包含好字符串和坏字符串混合的批处理中的所有好字符串,则常见模式是以bool TryParse(string st, ref int result)
样式公开方法。 就个人而言,我不喜欢这种模式,因为它没有提供指示解析失败原因的机制。 我会推荐一种不同的模式 - 类似于以下模式之一:
int TryParse(string st, out ParseStatus status);int TryParse(string st, ActionfailureAction);delegate void ActionRV<RefT,ValT>(ref RefT refparam, ValT valparam);int TryParse (string st, ActionRV<RefT,> FailureAction, ref T refParam);
在所有这三种调用模式中,如果ParseStatus
是可继承的类型,则TryParse
可以提供精确描述故障的ParseStatus
或派生类型的实例。 在第二和第三种模式的情况下,委托可以自己抛出异常,ParseStatus
存储一个应该返回给调用函数的值,或者做一些事情,比如修改原始参数字符串(如果它存储在ParseStatus
中)并设置一个标志来请求"重试"。 我个人喜欢第三种形式,因为我认为在任何一个都可以工作的情况下,ref
参数应该优先于闭包。 请注意,第二种形式可以按照第三种形式有效地实现:
static ExecAction(T param, ref Action proc){ proc(param);}int TryParse(string st, Action failureAction){ TryParse(st, ExecAction, ref failureAction);}
请注意,将failureAction
作为 ref 参数传递意味着可以为包装器函数使用静态委托,而不必使用闭包。