【问题标题】:How do I throw error in one function to be caught by another function?如何在一个函数中抛出错误以被另一个函数捕获?
【发布时间】:2019-09-17 22:35:12
【问题描述】:

我有这个“测试”代码:

function func1(){
    try{
    ...stuff...
    }catch(err){
        throw new Error();
    }
}

function func2(){
    try{
        func1();
    }catch(err){
        console.log("ERROR")
    }
}

func2();

我有一个函数在 try-catch 语句中的 catch 中引发错误。我想要它,如果 func1 抛出错误,它会被第一个 try-catch-statement 捕获,但是当我尝试这个时,它不会被第一个语句捕获,它只是暂停代码并返回错误。我做错了什么?这是错误的做法吗?

【问题讨论】:

  • 您到底需要什么?
  • 从您的描述中不清楚您正在尝试做什么以及什么不起作用 - 您能否提供更多详细信息,也许可以提供一个可运行的示例?但是您那里的代码应该(假设...stuff... 抛出错误)首先在func1 中捕获错误,然后引发一个新错误,然后在func2 中捕获它。
  • @KrishnaPrashatt func1 正在处理一些可能返回错误的操作,在这种情况下,我需要它返回 func2(调用 func1 的函数)并执行一些其他操作。
  • 如果是这样,为什么要对 func1 使用单独的 try/catch?因为你是在func2的try块中执行func1,如果出错,自然会去func2的catch块吧?

标签: javascript error-handling try-catch


【解决方案1】:

这段代码应该让您了解try/catch 块的工作原理。在第一个函数调用中,我们调用func2,它有一个try/catch 块。您可以在控制台中看到错误已被捕获并继续执行。然后我们调用func1,它会抛出一个未捕获的错误,并在控制台中显示为错误。

function func1() {
  console.log('func1...');
  throw new Error('something bad happened!');
}

function func2() {
  console.log('func2...');
  try {
    func1();
  } catch (err) {
    console.log('Caught error');
  }
}

console.log('func2()');
func2();

console.log('func1()');
func1();

【讨论】:

  • 这对我很有帮助。很难找到为什么在父函数中没有捕获错误的答案。我正在返回,现在正在投掷。谢谢。
【解决方案2】:

func1 中不需要单独的 try/catch 块,因为它已经在 func2 的错误处理程序中。在这种情况下,您从func1 抛出的任何错误都会被func2 自动捕获

function func1() {
    throw new Error('oops');
}

function func2() {
  try {
    func1();
  } catch(err) {
    alert(err.message);
  }
}
    
func2();

【讨论】:

  • 我在一个项目中遇到了这个问题,其中一部分代码中的运行时错误由代码的另一部分中的 try/catch 处理,我将其解释为与其中的代码无关错误发生。但是看到这个解释,我意识到代码只是在调用链中的更高级别处理..
【解决方案3】:

不确定你到底卡在哪里,但这应该可以:

确保检查你的真实控制台

function func1() {
  try {
    throw new Error('hi from func1')
  } catch (err) {
    throw err;
  }
}

function func2() {
  try {
    func1();
  } catch (err) {
    // this doesn't work in stack snippets console
    // hit f12 to see your real console
    console.log('catched in func2', err)
  }
}

func2();

【讨论】:

  • 这是我目前正在做的,但不是 func2 捕获错误,而是停止代码。
  • 它会抛出一个正常的错误,就像没有另一个 try-catch-statement 一样。
  • 又抛出了什么样的错误?一些错误将始终显示在控制台中。举个例子,我们猜不出你的代码:)
  • @Sagivb.gi 的代码与您编写的代码相似,我在第一个函数中使用了“throw err”并记录了错误,但是当我在func2 它抛出未定义的错误..你能帮我吗..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多