尝试抓住恢复

时间:2011-01-05 18:26:18

标签: exception-handling try-catch

如果我正在运行代码

try
{
line one 
line 2
line 3
.
.
.
.
}
catch(Exception x)
{
}

现在如果异常发生在我不知道的任何一行,我们在catch中做了一些事情,以便异常剂量不再在该行再次发生,现在我们需要从异常发生的位置进行排序并执行同一行我们怎么能这样做?

4 个答案:

答案 0 :(得分:3)

假设这是Java,你不能这样做 - 一旦抛出异常,try块的其余部分就不会执行任何操作。您必须使用多个try / catch块来明确地执行您想要的操作:

try {
    line one 
} catch (Exception x) {
    fixup line one
}

try {
    line 2
} catch (Exception x) {
    fixup line 2
}

...等

答案 1 :(得分:0)

那种尝试失败的目的。如果捕获异常,则应该处理错误。如果你想继续你离开的地方,最好的方法可能是将代码放在finally块中。如果存在异常或者没有抛出异常,则此代码将始终运行。

try {
    //some exception prone code
}
catch(Exception e) {
    //handle exception
}
finally {
    //Always runs after exception caught or if no exception thrown
}

答案 2 :(得分:0)

你没有。如果您解决了问题,则应该再次运行整个块。 try块的重点在于它拥有执行特定任务所需的一切。异常使得任务之后的一切都变得不可能。如果你需要清理,比如打开文件描述符,你可以使用finally块;但你真的需要解决问题,再试一次,或者以错误的错误信息消亡。

答案 3 :(得分:0)

你可以将try / catch块粘贴在循环中,如下所示:

bool done = NO;

while ( ! done ) {
    try {
        done = YES;
    } catch {

    }
}

这会导致整个块被重新执行。如果你想从你离开的地方继续,那么你需要跟踪你的状态:

bool     done = NO;
int     state = 0;  // setup some constants, kStateA = 0, kStateB = 1, etc:

while ( ! done ) {
    try {
        switch ( state ) {
            case kStateA:   line 1; ++state;    // fall through
            case kStateB:   line 2; ++state;
            // etc.
        }   

        done = YES;
    } catch {

    }
}

上面的代码,简化为更符合你的问题看起来像这样(虽然状态机概念仍然是基本原则):

bool    done = NO;
int     lineNumber = 1;

while ( ! done ) {
    try {
        switch ( lineNumber ) {
            case 1: line 1; ++lineNumber;   // fall through
            case 2: line 2; ++lineNumber;   // fall through
            // etc.
        }   

        done = YES;
    } catch {

    }
}