1

我在这里看到了一个类似的问题,但仍有一些我不明白的地方。据我所知,当您使用try-catch块时,如果抛出异常,则将立即执行 catch 块,并且不会执行catch同一代码块中子句之后的任何代码。因此,如果我做对了,如果我们有:

try
{
    // do something
    // throw an exception for some reason
}
catch (Exceptiox ex)
{
    // do something when there is and exception thrown
}
// some code that will never be runned if and exception was thrown above

我不能 100% 确定catch停止在其范围之外进一步执行,但这是我的问题之一,所以如果我错了,请纠正我。

那么,如果您根本不需要返回任何值,那么return在块中使用有什么意义呢?catch我在我正在处理的继承代码的一些方法中看到了这一点。例如:

public void DeleteImage(AppConfig imageInfo, string imageName)
{
    string imgPath = imageInfo.ConfigValue.ToString();
    try
    {
        File.Delete(imgPath + "\\" + imageName);
    }
    catch (Exception ex)
    {
        logger.Error(ex.ToString());
        return;
    }
}

除了记录错误,这里不需要做任何事情。为什么然后使用return. 这是一个错误吗?return如果您没有明确说明,该方法不会完成吗?catch如果子句之后有更多代码,如果return不存在并且catch仅用于记录错误,它会被执行吗?

4

3 回答 3

12

我不能 100% 确定 catch 是否会在其范围之外停止进一步执行,但这是我的问题之一,所以如果我错了,请纠正我。

不,这是不正确的。执行将在catch块之后继续正常执行,除非块内的某些代码更改了流程(例如throwreturn)。

因此,如果您不想继续执行,return 则有必要。即使块之后当前没有代码catch,恕我直言,可以更明确地说明“处理这种类型的异常涉及在此点之后不执行任何代码”。

也就是说,你应该警惕catch (Exception ex)——捕获所有类型的异常应该总是受到质疑,而且几乎总是不太正确的事情(尽管在这种情况下它是为了记录,这是“允许的规则例外”) .

于 2013-03-11T09:46:49.890 回答
3

我不能 100% 确定 catch 是否会在其范围之外停止进一步执行,但这是我的问题之一,所以如果我错了,请纠正我。

不,它没有。如果 catch 块既不重新抛出也不返回,执行将从 try/catch 语句的末尾继续。

在您提供的示例中,该return声明毫无意义。如果在 catch 块之后有代码,那将是另一回事,因为该return语句会使方法立即返回。

在这样的块中包含语句并不是错误,因为它是完全有效的代码,并且可能仍会按预期执行——但这绝对是奇怪的。它很可能是从声明重要的方法中剪切/粘贴的。returncatchreturn

(抓住 几乎总是一个坏主意Exception,但那是另一回事。)

于 2013-03-11T09:47:12.400 回答
0

如果没有 return 语句和其他任何代码而不是那个,那么该代码将被执行。并且您可以从 catch 块中返回任何东西。它没有任何限制。

于 2013-03-11T09:49:59.450 回答