代码之家  ›  专栏  ›  技术社区  ›  Muflix

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

  •  -1
  • Muflix  · 技术社区  · 4 年前

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

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

    0 回复  |  直到 4 年前
        1
  •  3
  •   Sergey Berezovskiy    4 年前

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

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