避免空的catch子句

时间:2014-10-23 20:40:49

标签: javascript try-catch-finally

我有一个功能,可以检查用户是否进行了任何更改,如果是,则警告他们这一事实。当他们选择放弃他们的更改时,我有另一个功能:a)恢复状态以进行预编辑,以及b)更新一个全局对象,其中包含有关当前编辑的信息(包括是否存在)。

想要发生的事情是,在尝试删除编辑框元素时会抛出一些错误,因此系统不会更新全局对象标记或显示隐藏的预编辑元素。如果发生这种情况,程序可能会认为编辑仍然在进行时仍未进行,使用户陷入"丢弃更改?"周期。出于这个原因,我捕获了在销毁阶段抛出的任何错误,然后显示隐藏的元素并更新全局,如下所示:

function cancelEdit() {

    try {
        // destroy editing boxes
        // [code goes here]
    } catch(e) {
    } finally {
        // restore hidden elements
        // [code goes here]

        // update global edit cache object
        // [code goes here]

        // rethrow the error for analysis server-side
        if(window.onerror) window.onerror();
    }

}

上面有一个空的挡块看起来像是一个代码味道,但我不认为这种方式一定更好。 (但也许是。)

function cancelEdit() {

    try {
        // destroy editing boxes
        // [code goes here]
    } catch(e) {
        cancelEditInternal();
        // rethrow the error for analysis server-side
        throw e;
    }

    cancelEditInternal();

}

function cancelEditInternal() {

    // restore hidden elements
    // [code goes here]

    // update global edit cache object
    // [code goes here]

}

我错过了什么吗?是否存在一种我忽略的模式......或者这仅仅是因为我在使用try / catch / finally时通常不会使用它?

2 个答案:

答案 0 :(得分:4)

您可以使用finally块:

function cancelEdit() {
    try {
        // destroy editing boxes
        // [code goes here]
    } finally {
        cancelEditInternal();
    }

}

finally块将被执行,无论try的主体是否抛出错误。 (如果保留catch子句,finally块仍将执行。)

答案 1 :(得分:3)

如果您不想要catch阻止,请不要使用它:

try {
    // destroy editing boxes
    // [code goes here]
} finally {
    // restore hidden elements
    // [code goes here]

    // update global edit cache object
    // [code goes here]

    // rethrow the error for analysis server-side
    if(window.onerror) window.onerror();
}

正如您在specification中看到的那样,try语句由try后跟catchfinally或两者组成。