📜  如何在没有 try/catch 块的情况下重写代码示例?

📅  最后修改于: 2022-05-13 01:56:12.909000             🧑  作者: Mango

如何在没有 try/catch 块的情况下重写代码示例?

执行 JavaScript 代码时几乎肯定会发生错误。这些问题可能是由于编程错误、错误输入或程序逻辑问题引起的。然而,所有的错误都可以解决,为此,我们有不同的说法,但最常用的是“try and catch”。

但是,如果一个方法包含可能在执行期间产生异常的代码,我们通常用一个 try-catch 块包围该代码来处理异常。

示例 1:不使用 try-catch 语句

Javascript
console.log("Start of program");
helloWorld;
console.log("Another program execution");


Javascript
try {
    console.log("Start of program");
    helloWorld;
}
catch (err) {
    console.log("Error has occurred" + err.stack);
}
 
console.log("Another program execution");


Javascript
async function anyFunction() {
    try {
        const result = await fetch("http://author.com");
        try {
            const another = await fetch("http://huihuihui.com");
        } catch (anotherError) {
            console.log(anotherError);
        }
    } catch (e) {
        // Some other error handling
    }
    try {
        const anotherResult = await someOtherAsync();
    } catch (errorFromAnotherResult) {
        // Some other error
    }
}


Javascript
async function getResult(num: number):
    Promise {
    if (num === 0) {
        throw new Error("Error found!")
    }
    return num;
}


Javascript
const tryToCatch = async (fn: Function, ...args: any) => {
    try {
        return [null, await fn(...args)];
    }
    catch (err) {
        return [err];
    }
};


Javascript
async function run() {
    let result;
 
    try {
        result = await getResult(0);
    } catch (error) {
        console.log("Error handled");
    }
 
    console.log({ result });
};


Javascript
async function run() {
    const [error, result] = await tryToCatch(getResult, 1);
    if (error) {
        console.log(error);
        return error;
    }
    console.log({ result });
};


输出:

Start of program
Uncaught ReferenceError: helloWorld is not defined

示例 2:使用 try-catch 语句

Javascript

try {
    console.log("Start of program");
    helloWorld;
}
catch (err) {
    console.log("Error has occurred" + err.stack);
}
 
console.log("Another program execution");

输出:

Start of program
Error has occurred ReferenceError: helloWorld is not defined
Another program execution

在上面的例子中,该方法在执行过程中抛出了异常,并且因为有一个try-catch块用于异常处理,所以程序执行成功,没有异常终止!

1. 什么时候使用 Try-Catch 比较合适?

如果您希望向用户隐藏错误或为用户的利益创建自定义错误,则应使用 try-catch 语句,并且它还具有向那些无论如何都不会理解的人隐藏技术性错误消息的优势。

当您认为无论出于何种原因会发生超出您控制的错误时,最好在部分代码中使用 Try-catch。

2. 什么时候应该避免使用 Try-Catch?

如果您知道可能会发生错误,则不应使用 try-catch 语句,因为您宁愿调试问题而不是掩饰问题。

让我们看一个例子来更好地理解这一点!

示例 1:嵌套的 Try-Catch

Javascript

async function anyFunction() {
    try {
        const result = await fetch("http://author.com");
        try {
            const another = await fetch("http://huihuihui.com");
        } catch (anotherError) {
            console.log(anotherError);
        }
    } catch (e) {
        // Some other error handling
    }
    try {
        const anotherResult = await someOtherAsync();
    } catch (errorFromAnotherResult) {
        // Some other error
    }
}

为什么需要避免编写过多的 try-catch 语句?

每天,开发人员编写代码,我们需要仔细检查缺陷,并且您在各处编写 try/catch 块以防止程序崩溃。因为你想标准化你的错误管理,你有时可能会过火。

诸如“Try / Catch”之类的语句比比皆是……它们有时甚至可以嵌套或链接,因为代码变得多余充满了相同的不必要代码,而且您也不想依赖外部库的错误格式(或自定义它)。

你必须承认这是乏味、重复和乏味的。

但是,正如我们将在下面看到的,通过制作一个中间件(用一小段代码),我们可以通过将我们的异步代码封装到一个简单的中间件(或者你可以说实用函数)中来实现更大、更强大的功能这。

让我们看看我们的代码内部发生了什么!但首先,让我们看看我们的“ getResult ”函数:

Javascript

async function getResult(num: number):
    Promise {
    if (num === 0) {
        throw new Error("Error found!")
    }
    return num;
}

基本上,这个函数接受一个数字,它会返回一个返回数字或错误的承诺。

如果数字为零,它将返回错误或返回一个数字。

输出:

输入:0

Error found!

输入:1

1

现在,为了以更实用的方式执行此操作,我们创建了名为“ tryToCatch ”的实用函数——该函数接受一个函数和参数,它将尝试在 try-catch 块中运行我们的函数,并将错误返回为 null然后它将返回我们函数的结果,否则它将返回错误。

Javascript

const tryToCatch = async (fn: Function, ...args: any) => {
    try {
        return [null, await fn(...args)];
    }
    catch (err) {
        return [err];
    }
};

让我们重构我们的代码以使用我们的新实用程序函数来删除 try-catch 块,方法是将我们的函数包装在名为“tryToCatch”的实用程序函数中

示例 1:使用传统的 try-catch 语句。

Javascript

async function run() {
    let result;
 
    try {
        result = await getResult(0);
    } catch (error) {
        console.log("Error handled");
    }
 
    console.log({ result });
};

输出:

Error handled

示例 2:使用实用函数重构相同的代码。

Javascript

async function run() {
    const [error, result] = await tryToCatch(getResult, 1);
    if (error) {
        console.log(error);
        return error;
    }
    console.log({ result });
};

输出:

{result:1}

现在我们可以处理我们的错误,并且可以让我们的结果控制台日志保持正常。除了通常的 try/catch 块之外,您现在还可以使用类似顺序的样式来处理错误。