Java 中的复杂异常处理
Sophisticated exception handling in Java
在下面的场景中,
public void fooMethod()
{
try
{
methodToCall();
}catch( FooException exception )
{
methodToCall();
}
}
private int methodToCall() throws FooException
{
throw new FooException();
}
我想调用methodToCall
(例子)10次试试是否成功
由于在 catch 块中没有捕获到异常,并且在上面给出的示例中,methodToCall 总共被调用了两次(一次在 try 块中,一次在 catch 块中。)
我应该如何设计代码才能使 methodToCall
即使抛出给定的异常也会被调用 10 次。
编辑
实际的 fooMethod 比这个复杂得多,我不能递归调用它,因为比这个 try-catch 子句之前还完成了其他几项工作。
public void fooMethod()
{
int counter = 0 ;
while(counter < 10){
try
{
methodToCall();
counter = 11;
}catch( FooException exception )
{
counter++;
}
}
}
for 循环将确保进行 10 次调用。 try catch 会阻止退出循环。
public void run10TimesWhatsoever() {
for(int i = 0; i < 10; ++i) {
try {
methodToCall();
} catch (final FooException ignore) {
}
}
}
但是,如果您想最多调用 10 次并在成功时停止,您可以使用类似的方法
public void attemptUpTo10Times() {
for(int i = 0; i < 10; ++i) {
try {
methodToCall();
break; // exit the loop if no exception were thrown
} catch (final FooException ignore) {
if (i == 9) {
throw new IllegalStateException("Failed 10 times in a row");
}
}
}
}
在下面的场景中,
public void fooMethod()
{
try
{
methodToCall();
}catch( FooException exception )
{
methodToCall();
}
}
private int methodToCall() throws FooException
{
throw new FooException();
}
我想调用methodToCall
(例子)10次试试是否成功
由于在 catch 块中没有捕获到异常,并且在上面给出的示例中,methodToCall 总共被调用了两次(一次在 try 块中,一次在 catch 块中。)
我应该如何设计代码才能使 methodToCall
即使抛出给定的异常也会被调用 10 次。
编辑
实际的 fooMethod 比这个复杂得多,我不能递归调用它,因为比这个 try-catch 子句之前还完成了其他几项工作。
public void fooMethod()
{
int counter = 0 ;
while(counter < 10){
try
{
methodToCall();
counter = 11;
}catch( FooException exception )
{
counter++;
}
}
}
for 循环将确保进行 10 次调用。 try catch 会阻止退出循环。
public void run10TimesWhatsoever() {
for(int i = 0; i < 10; ++i) {
try {
methodToCall();
} catch (final FooException ignore) {
}
}
}
但是,如果您想最多调用 10 次并在成功时停止,您可以使用类似的方法
public void attemptUpTo10Times() {
for(int i = 0; i < 10; ++i) {
try {
methodToCall();
break; // exit the loop if no exception were thrown
} catch (final FooException ignore) {
if (i == 9) {
throw new IllegalStateException("Failed 10 times in a row");
}
}
}
}