【发布时间】:2014-10-09 21:46:37
【问题描述】:
在这里使用 goto 似乎很自然。
一个项目需要读取pdf文件,pdf文件可以是以下之一。
- 不受保护
- 受密码保护1
- 受密码保护2
- 受密码保护3
文件只能使用正确的密码才能访问,无法预先知道文件需要哪个密码。我们必须尝试所有情况,(不包括密码)。如果以上密码均无效,则抛出异常。
PdfReader GetPdfReader(string filePath)
{
PdfReader r = null;
int Retries = 0;
start: try
{
switch (Retries)
{
case 0: r = new PdfReader(filePath); break;
case 1: r = new PdfReader(filePath, password1); break;
case 2: r = new PdfReader(filePath, password2); break;
case 3: r = new PdfReader(filePath, password3); break;
}
}
catch (BadPasswordException ex)
{
if (Retries == 3) throw ex;
Retries++;
goto start;
}
return r;
}
嵌入 try/catch 可以工作,但看起来很难看,使用 goto 看起来很自然。
两个问题:
- 我应该替换这个 goto 吗?
- 有没有优雅的方法来替换这个 goto?
谢谢
【问题讨论】:
-
是的,你应该这样做。为什么你不只使用循环?您正在用 C# 中的
goto... 模拟一个 -
永远不要使用
throw ex重新抛出异常,而只需使用throw。throw ex不会像 throw 那样保留原始堆栈跟踪。这对于调试非常有用。 -
一个简单的
while (Retries <= 3)足以替换这里的goto。switch()也不完全是优雅的高度。 -
@EdS.:他不是模拟一个循环,而是实现一个循环。
while基本上做同样的事情。 -
是的,更换它。这是没有意义的并且它向上。跳出或跳入嵌套循环可能是件好事,但这里的 goto 没有任何价值。
标签: c# try-catch goto readability