我有以下代碼,但我不確定退出該Execute()方法的正確模式是什么。
代碼運行正常,但是Execute()方法太大了。
public void Execute()
{
// load datatable from excel
DataTable data = new();
try
{
data = ExcelReader.ToDataTable(_meta.FullPath, new() { SheetName = _sheetName });
}
// these errors are fine, but the dataset is not relevant and we want exit the execution
catch (ArgumentOutOfRangeException e)
{
if (e.Message.Contains("HeaderRowIndex")) return;
}
catch (ArgumentNullException e)
{
if (e.Message.Contains("Parameter 'sheet'")) return;
}
// execute logic on dataset
// ..
}
我想將load data代碼的一部分移動到這樣的單獨方法中,但是我不知道如何結束執行。
public void Execute()
{
// load data
DataTable data = new();
LoadData();
// execute logic on dataset
// ...
}
private DataTable LoadData()
{
try
{
data = ExcelReader.ToDataTable(_meta.FullPath, new() { SheetName = _sheetName });
}
// these errors are fine, but the dataset is not relevant and we want exit the execution => but how?
catch (ArgumentOutOfRangeException e)
{
if (e.Message.Contains("HeaderRowIndex")) return; // will return to Execute() method, but not exit it.
}
catch (ArgumentNullException e)
{
if (e.Message.Contains("Parameter 'sheet'")) return; // will return to Execute() method, but not exit it.
}
}
我認為這是一個非常普遍的問題,那么處理這個要求的推薦方法是什么?LoadData例如,我是否應該從該方法創建一些回傳物件
class LoadDataResult
{
public DataTable data {get; set};
public bool IsRelevant {get; set};
}
dataResult = LoadData()
if (!dataResult.IsRelevant) return;
還是存在一種矯枉過正且更簡單的解決方案(不使用這些結果物件填充程式)?
uj5u.com熱心網友回復:
您可以在輸出引數中回傳資料并將資料加載的結果作為主要方法輸出回傳(加載成功為true,錯誤為false):
private bool TryLoadData(out DataTable data)
{
data = null;
try
{
data = ExcelReader.ToDataTable(
_meta.FullPath, new() { SheetName = _sheetName });
return true; // loading succeeded
}
catch (ArgumentOutOfRangeException e)
when (e.Message.Contains("HeaderRowIndex"))
{
// loading failed, continue to Execute method
return false;
}
catch (ArgumentNullException e)
when (e.Message.Contains("Parameter 'sheet'"))
{
// loading failed, continue to Execute method
return false;
}
// otherwise exception propagates to Execute method
}
用法:
public void Execute()
{
if (TryLoadData(out var data)
{
// execute logic on dataset
}
else
{
// error, but not exception
}
}
uj5u.com熱心網友回復:
我會考慮你想要回傳的東西。在您的捕獲中,您可以記錄錯誤但不需要回傳。無論是否回傳,所有代碼都將回傳到呼叫它的前一個方法。僅當您需要將值傳遞回前一個呼叫方法時才需要回傳。否則,你可以就這樣吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/383682.html
上一篇:如何從集合創建陣列
