提问者:小点点

如何在不引发异常的情况下从子方法退出方法


我有以下代码,但是我不确定退出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
    // ..
}

我想将加载数据部分代码移动到单独的方法中,就像这样,但是我不知道如何结束执行。

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;

或者这是一个过度和更容易的解决方案存在(不填充程序与这些结果对象)?


共2个答案

匿名用户

您可以在输出参数中返回数据,并将数据加载的结果作为主要方法输出返回(成功加载为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
    }
}

匿名用户

我会想一想你想要回报什么。在catch中,您可以记录错误,但无需返回。所有代码都将流回调用它的前一个方法,不管它是否返回。仅当需要将值传递回上一个调用方法时才需要返回。否则,你就别管它了!