只是想知道这是否被认为是在 C# 中明确使用 goto :
IDatabase database = null;
LoadDatabase:
try
{
database = databaseLoader.LoadDatabase();
}
catch(DatabaseLoaderException e)
{
var connector = _userInteractor.GetDatabaseConnector();
if(connector == null)
throw new ConfigException("Could not load the database specified in your config file.");
databaseLoader = DatabaseLoaderFacade.GetDatabaseLoader(connector);
goto LoadDatabase;
}
我觉得这没问题,因为片段很小并且应该有意义。当您想在处理异常后重试操作时,人们通常是否有另一种方法可以从此类错误中恢复?
编辑:那很快。回答几个问题并稍微澄清一下 - 这是从不同类型的项目转换而来的过程的一部分。_userInteractor.GetDatabaseConnector() 调用是确定用户是否要重试的部分(可能使用与他们正在加载的配置中的数据库不同的数据库)。如果它返回 null,则没有指定新的数据库连接,操作应该完全失败。
我不知道为什么我没有想到使用 while 循环。应该是离下午 5 点太近了。
编辑 2:我查看了 LoadDatabase() 方法,DatabaseLoaderException
如果失败,它会抛出一个。我已经更新了上面的代码来捕获那个异常而不是异常。
编辑3:普遍的共识似乎是
- 不需要在这里使用 goto - while 循环就可以了。
- 使用这样的异常不是一个好主意 - 我不确定用什么来替换它。