标签: throw

`throw new Error`和`throw someObject`有什么区别?

我想编写一个常见的错误处理程序,它将捕获在任何代码实例上故意抛出的自定义错误.

当我throw new Error('sample')在下面的代码中做了

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}
Run Code Online (Sandbox Code Playgroud)

日志在Firefox中显示,Error: [object Object]我无法解析该对象.

对于第二个throw,日志显示为:Error: hehe

而当我这样做的时候

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}
Run Code Online (Sandbox Code Playgroud)

控制台显示为:Object { hehe="haha"}其中我能够访问错误属性.

有什么不同?

是否在代码中看到了差异?像字符串一样只是作为字符串和对象传递给对象,但语法会有所不同吗?

我没有探索过抛出错误对象......我只是抛出了字符串.

还有除上述两种方法之外的其他方法吗?

javascript error-handling exception-handling object throw

336
推荐指数
10
解决办法
21万
查看次数

从构造函数中抛出异常

我正在和一位同事讨论如何从构造函数中抛出异常,并且我想要一些反馈.

从设计的角度来看,从构造函数中抛出异常是否可以?

假设我在一个类中包装一个POSIX互斥锁,它看起来像这样:

class Mutex {
public:
  Mutex() {
    if (pthread_mutex_init(&mutex_, 0) != 0) {
      throw MutexInitException();
    }
  }

  ~Mutex() {
    pthread_mutex_destroy(&mutex_);
  }

  void lock() {
    if (pthread_mutex_lock(&mutex_) != 0) {
      throw MutexLockException();
    }
  }

  void unlock() {
    if (pthread_mutex_unlock(&mutex_) != 0) {
      throw MutexUnlockException();
    }
  }

private:
  pthread_mutex_t mutex_;
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是标准的方法吗?因为如果pthread mutex_init调用失败,则互斥对象不可用,因此抛出异常可确保不会创建互斥锁.

我是否应该为Mutex类创建一个成员函数init,并pthread mutex_init在其中调用将返回基于返回的bool pthread mutex_init?这样我就不必为这种低级对象使用异常.

c++ constructor exception throw

265
推荐指数
7
解决办法
18万
查看次数

我应该在C++中使用异常说明符吗?

在C++中,您可以通过使用异常说明符指定函数可能会也可能不会抛出异常.例如:

void foo() throw(); // guaranteed not to throw an exception
void bar() throw(int); // may throw an exception of type int
void baz() throw(...); // may throw an exception of some unspecified type
Run Code Online (Sandbox Code Playgroud)

由于以下因素,我对实际使用它们表示怀疑:

  1. 编译器并没有以任何严格的方式真正强制执行异常说明符,因此效益并不高.理想情况下,您希望得到编译错误.
  2. 如果函数违反了异常说明符,我认为标准行为是终止程序.
  3. 在VS.Net中,它将throw(X)视为throw(...),因此遵守标准并不强.

你认为应该使用异常说明符吗?
请回答"是"或"否"并提供一些理由来证明您的答案.

c++ exception function throw specifier

119
推荐指数
5
解决办法
3万
查看次数

为什么我不能扔进Promise.catch处理程序?

为什么我不能Error在catch回调中抛出一个内部并让进程处理错误,就好像它在任何其他范围内一样?

如果我什么都不做console.log(err)就会被打印出去,我对发生的事情一无所知.这个过程刚刚结束......

例:

function do1() {
    return new Promise(function(resolve, reject) {
        throw new Error('do1');
        setTimeout(resolve, 1000)
    });
}

function do2() {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            reject(new Error('do2'));
        }, 1000)
    });
}

do1().then(do2).catch(function(err) {
    //console.log(err.stack); // This is the only way to see the stack
    throw err; // This does nothing
});
Run Code Online (Sandbox Code Playgroud)

如果回调在主线程中执行,为什么Error会被黑洞吞噬?

javascript asynchronous throw promise es6-promise

119
推荐指数
3
解决办法
7万
查看次数

在C++中,如果throw是一个表达式,它的类型是什么?

我在我的一个简短的尝试中选择了这个来reddit:

http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/

基本上,作者指出在C++中:

throw "error"
Run Code Online (Sandbox Code Playgroud)

是一种表达.这在C++标准中实际上非常清楚地阐明了,包括主文本和语法.但是,至少对我来说不清楚的是表达的类型是什么?我猜到了" void",但是有点尝试使用g ++ 4.4.0和Comeau产生了这样的代码:

    void f() {
    }

    struct S {};

    int main() {
        int x = 1;
        const char * p1 = x == 1 ? "foo" : throw S();  // 1
        const char * p2 = x == 1 ? "foo" : f();        // 2
    }
Run Code Online (Sandbox Code Playgroud)

编译器对// 1没有问题,但在// 2上进行了禁止,因为条件运算符中的类型不同.所以throw表达式的类型似乎不是空的.

那是什么?

如果您回答,请使用标准中的引号备份您的陈述.


事实证明,抛出表达式的类型并不像条件运算符如何处理throw表达式那样 - 这在今天之前我当然不知道.感谢所有回复的人,尤其是David Thornley.

c++ throw

115
推荐指数
3
解决办法
5464
查看次数

在c ++中,异常如何工作(幕后)

我一直看到有人说异常很慢,但我从来没有看到任何证据.因此,我不会询问它们是否存在,而是会询问异常是如何在场景背后起作用的,因此我可以决定何时使用它们以及它们是否很慢.

据我所知,异常与做一堆返回是一回事,但它也会检查何时需要停止返回.它如何检查何时停止?我正在猜测并说有一个第二个堆栈,其中包含异常类型和堆栈位置然后返回直到它到达那里.我也猜测堆栈触摸的唯一时间是抛出和每次尝试/捕获.使用返回代码实现类似行为的AFAICT将花费相同的时间.但这都是猜测,所以我想知道.

例外如何真正起作用?

c++ performance exception try-catch throw

108
推荐指数
5
解决办法
3万
查看次数

C++ 03 throw()说明符C++ 11 noexcept之间的区别

有没有之间的任何其他差别throw()noexcept除了被检查的运行时分别编译时间?

维基百科C++ 11文章表明不推荐使用C++ 03 throw说明符.
为什么这样,noexcept有足够的能力在编译时覆盖所有这些?

[注意:我提到了这个问题这篇文章,但没有得到弃用的充分理由.]

c++ exception throw noexcept c++11

94
推荐指数
2
解决办法
2万
查看次数

在Java中,C#中是否存在throws关键字?

可能重复:
如何在C#中使用Java风格的throws关键字?

我有一个例外发生异常的功能

private void functionName() throws Exception
{
   // some code that might throw an exception
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

c# java exception throw throws

85
推荐指数
3
解决办法
7万
查看次数

你能用Java做什么?

传统观点认为你只能抛出Throwable用Java 扩展的对象,但是有可能禁用字节码验证器并让Java编译并运行抛出任意对象的代码 - 甚至是原语吗?

我查看了JVM athrow,它将在操作数堆栈上弹出第一个objref; 但它会检查所述参考是否指向Throwable运行时?

java exception throw

61
推荐指数
3
解决办法
7611
查看次数

在修改后的异常上使用`throw;`

我有一个foo可以抛出bar异常的函数.

在我调用的另一个函数中,foo但是bar如果抛出,我可以向异常添加更多细节.(foo由于该函数的通用特性,我宁愿不将这些信息作为参数传递给它,因为它并不真正属于那里.)

所以我在调用者中这样做:

try {
    foo();
} catch (bar& ex){
    ex.addSomeMoreInformation(...);
    throw;
}
Run Code Online (Sandbox Code Playgroud)

throw重新抛出修改过的异常还是我需要使用throw ex;?后者可能会采用有价值的副本,所以我宁愿不这样做.还会throw带一个价值副本吗?我怀疑它不会.

(我知道我可以验证,但我担心绊倒一个未指定或未定义的构造,所以想知道肯定).

c++ exception-handling exception throw language-lawyer

57
推荐指数
2
解决办法
2765
查看次数