我應該有一個函式,它必須回傳string一個錯誤(通過try/ catch)或一個不同的型別 T。
此類函式的示例:
public T get()
{
T struttura;
try {
...
}
catch (Exception xcp) {
return xcp.Message;
}
...
return struttura;
}
uj5u.com熱心網友回復:
有很多方法可以做到這一點,但請認真考慮這是否是您真正想要的。讓例外冒泡到呼叫代碼中幾乎總是更好。
第一種方法是使用out引數。
public string get(out T result)
{
T struttura;
try{...}
catch (Exception xcp)
{
result = default(T);
return xcp.Message;
}
...
result = struttura;
return String.Empty;
}
第二種方法是使用一個ValueTuple:
public (T, string) get()
{
T struttura;
try{...}
catch (Exception xcp){return (default(T), dexcp.Message);}
...
return (struttura, string.Empty);
}
uj5u.com熱心網友回復:
.net 設計指南https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exception-throwing 建議永遠不要將例外作為回傳型別回傳。拋出錯誤并在呼叫者中捕獲總是更好的設計。
該指南還建議,如果您不想拋出錯誤,您可以遵循 TryParse 模式https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exceptions-and-performance#嘗試決議模式。通常,您提供兩種方法 Get 和 TryGet。Try 方法的存在應該向呼叫者表明 Get 將拋出例外,而 TryGet 不會。如果操作成功,TryGet 還會回傳一個布林值,允許您在不使用呼叫者的 try/catch 塊的情況下處理負面情況。
uj5u.com熱心網友回復:
我建議TryGet簽名:
public bool TryGet(out T struttura) {
try {
...
struttura = ...
...
return true;
}
catch (Exception xcp){
struttura = default(T);
return false;
}
}
用法:
if (TryGet(out var myStruct)) {
// succeeded, myStruct is returned struttura
}
else {
// failed
}
或者根本不捕獲例外或重新拋出例外作為自定義例外:
public T Get() {
try {
...
return struttura;
}
catch (Exception xcp) {
throw new MyException("My message", xcp);
}
}
用法:
try {
myStruct = Get();
}
catch (MyException e) {
// Failed, e.Message for message
Console.WriteLine(e.Message);
}
最后,您可以機械地組合valueandmessage并回傳命名的 tuple:
public (T value, string message) Get() {
try {
...
return (struttura, null);
}
catch (Exception xcp) {
return (default(T), xcp.message);
}
}
用法:
var result = Get();
if (result.message == null) {
// succceded with result.value
}
else {
// failed with result.message
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/393656.html
