【发布时间】:2022-01-24 14:05:18
【问题描述】:
我应该有一个函数必须返回错误的string(通过try / catch)或不同的类型 T。
示例这样的功能:
public T get()
{
T struttura;
try {
...
}
catch (Exception xcp) {
return xcp.Message;
}
...
return struttura;
}
【问题讨论】:
-
为什么不直接抛出异常,让调用者处理呢?
-
out而不是 return ? -
为什么只返回部分异常?如果不打算处理异常,为什么要捕获异常?这不会使代码更可靠——恰恰相反。异常包含的不仅仅是一条消息——它包含的内部异常可能包含比根异常更多的信息、一个调用堆栈,它显示导致异常的调用链以及异常的位置被抛出
-
同意,只要抛出异常,让调用方法处理即可。仅仅返回异常消息是没有意义的,因为你会错过调用堆栈和任何内部异常。
-
有一些方法可以返回结果或错误,但它们需要仔细编码,而不仅仅是忽略错误。这通常会导致比让异常传播到可以处理的级别更复杂的代码。在 Go 中,函数通常返回一个带有结果或错误的元组。 Go 代码 always 在使用结果之前检查是否有错误。等效使用
(T,Exception)作为返回类型。在 F# 和 Rust 中,使用了Result<TResult,TError>类型。在F#中,成功和失败用不同的类型表示,防止代码使用无效结果