提问者:小点点

try语句中要执行的代码应该在哪里?


mp.events.addCommand('admin', (player, _, targetPlayer, targetAdminLevel) => {
    const targetSocialID = targetPlayer.rgscId;
    try {
        if (player.adminLevel < 8)  throw "Este comando só está disponível para administradores de nível superior a 8.";
        if (!targetPlayer) throw "Uso: /admin <ID/NOME> <NÍVEL DE ADMINISTRADOR>.";
        if (player.adminLevel <= targetAdminLevel) throw "Não podes promover alguém a um nível superior ao teu.";
        if (!global.findPlayer(targetPlayer)) throw "Esse jogador não existe ou não está online.";
        if (!targetAdminLevel) throw `Não definiste para que nível pretendes promover ${targetPlayer}.`;
        if (isNaN(targetAdminLevel)) throw "O nível de administrador deve ser um número."
    }
    catch(err) {
        player.outputChatBox(`!{${corErro}}${err}`)
    }
    finally {
        console.log("Finally")
    }
});

我写了上面的代码。它检查大量的错误。我的问题是:当这些错误都没有发生时,我应该把要执行的代码放在哪里?

如果没有错误,那么这个。


共2个答案

匿名用户

throw将终止当前执行上下文,并将控制流传递给最近的try堆栈祖先的关联catch。因此,如果没有错误,请将语句放在try}:

mp.events.addCommand('admin', (player, _, targetPlayer, targetAdminLevel) => {
    const targetSocialID = targetPlayer.rgscId;
    try {
        if (player.adminLevel < 8)  throw "Este comando só está disponível para administradores de nível superior a 8.";
        if (!targetPlayer) throw "Uso: /admin <ID/NOME> <NÍVEL DE ADMINISTRADOR>.";
        if (player.adminLevel <= targetAdminLevel) throw "Não podes promover alguém a um nível superior ao teu.";
        if (!global.findPlayer(targetPlayer)) throw "Esse jogador não existe ou não está online.";
        if (!targetAdminLevel) throw `Não definiste para que nível pretendes promover ${targetPlayer}.`;
        if (isNaN(targetAdminLevel)) throw "O nível de administrador deve ser um número."

        console.log('No errors were found!'); // <---------------------
    }
    catch(err) {
        player.outputChatBox(`!{${corErro}}${err}`)
    }
    finally {
        console.log("Finally")
    }
});

匿名用户

您可以为此目的使用一个标志:

mp.events.addCommand('admin', (player, _, targetPlayer, targetAdminLevel) => {
    const targetSocialID = targetPlayer.rgscId;
    var isSuccess = true;
    try {
        if (player.adminLevel < 8)  throw "Este comando só está disponível para administradores de nível superior a 8.";
        if (!targetPlayer) throw "Uso: /admin <ID/NOME> <NÍVEL DE ADMINISTRADOR>.";
        if (player.adminLevel <= targetAdminLevel) throw "Não podes promover alguém a um nível superior ao teu.";
        if (!global.findPlayer(targetPlayer)) throw "Esse jogador não existe ou não está online.";
        if (!targetAdminLevel) throw `Não definiste para que nível pretendes promover ${targetPlayer}.`;
        if (isNaN(targetAdminLevel)) throw "O nível de administrador deve ser um número."
    }
    catch(err) {
        isSuccess = false;
        player.outputChatBox(`!{${corErro}}${err}`)
    }
    finally {
        console.log("Finally")
    }
    if (isSuccess) /*Do something here*/;
});

您可以使它更通用:

function catcher(tryHandler, catchHandler, finallyHandler) {
    var isSuccess = true;
    try {
        tryHandler();
    } 
    catch (err) {
        isSuccess = false;
        catchHandler();
    }
    finally {
        finallyHandler();
    }
}

你可以像这样使用它

if (catcher(tryHandler, catchHandler, finallyHandler)) {
    //All was successful
} else {
    //There was some error
}

您也可以使用Promise API,在if中实现Promise,并在else中拒绝它。