当前位置: 首页 > 知识库问答 >
问题:

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

阎懿轩
2023-03-14

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

姚海
2023-03-14

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

陶元凯
2023-03-14

您可以在输出参数中返回数据,并将数据加载的结果作为主要方法输出返回(成功加载为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
    }
}
 类似资料:
  • 问题内容: 我“d成的运行Django的服务器,我不能简单地和出来。 是否有其他摆脱困境的方法? 目前,我手动关闭本地PC上的选项卡,然后再重新打开,但这变得很烦人。 问题答案: 或 。请参阅屏幕手册#分离。

  • 问题内容: 我需要一种从try / catch块的中间中断而又不会引发异常的方法。类似于中断并继续for循环的操作。这可能吗? 我对于抛出一个自定义异常(将其命名为“ BreakContinueException”)变得很奇怪,该异常在其catch处理程序中什么都不做。我敢肯定这很扭曲。 因此,我不知道任何直接的解决方案吗? 问题答案: 正确的方法可能是通过将try-catch块放在单独的方法中来

  • 我有两个模块,一个从rest模板调用另一个。(管理员调用notifServer)notifServer有一个用Async注释的方法。我想在该方法中抛出一个异常,但管理员获取响应太快,并且无法在admin中捕获异常方法。 我是spring和@Async进程的新成员。我已经尝试将响应主体从NotifServer映射到C的CompletableFuture。类 。但我仍然没有得到错误响应。 此代码来自管

  • 问题内容: 在下面的源代码中,我抛出一个。 为什么没有必要将关键字放在方法的签名上? 问题答案: 仅在Java 1.7上会出现此现象。使用1.6进行编译时,出现以下编译器错误消息: 但是,使用Java 1.7可以编译。 …直到我实际把一个块扔了进去: 编译中… 看起来Java 1.7足够聪明,可以通过分析块代码来检测可能抛出的类型,而1.6刚看到类型并为此给出了错误。 对其进行更改以使其按预期方式

  • 问题内容: 我正在编写一个Java程序,该程序读取一个单词文件。程序至关重要地依赖于此文件,因此,无论出于何种原因,在读取文件时都出现IOException,我确实希望程序结束。 结束程序的最佳方法是什么?我认为我被迫将文件读取包围在try / catch块中,因此我应该在catch中添加一个内部吗?例如,我应该做以下事情吗? 问题答案: 如果让异常一直传播到方法,程序将结束。无需调用,只需允许异

  • 我正在使用JAXB XMLadapter封送和反封送布尔值。应用程序的XML文件也将被C#应用程序访问。我们必须验证这个XML文件,这是使用XSD完成的。C#应用程序为布尔节点编写“true”值。但XSD也验证了这一点,因为它只允许“true/false”或“1/0”。因此,我们在XSD中保留了布尔值的String,该String将由XMLAdapter验证,以便在我们这边进行封送和反封送。XML

  • 问题内容: 我需要在Jenkins Pipeline中解析一些JSON并在循环中调用一些常规方法,但是脚本始终在第一个函数调用后退出。这该怎么做? 在上面的示例中,即使使用json对象,例如: …管道总是在第一次迭代后退出。据推测这是由于混合了同步和异步功能。有什么办法吗? 问题答案: 我已经通过执行以下操作基本上解决了此问题: 使用完JsonSlurper实例后,立即销毁它,删除@NonCPS批

  • 我正在使用Mojang API从Minecraft玩家的用户名返回UUID。此方法在参数(我们想要知道UUID的播放器的用户名)中接受一个字符串。为了使用API的resultat,我使用SimpleJSON库(将JSON结果解析为要返回的字符串)。 我的方法抛出2个检查过的异常:IOExeption和Parse异常,因为我想要。当错误的用户名(因此不存在用户名)时,API返回一个空JSON对象,在