我想编写一个常见的错误处理程序,它将捕获在任何代码实例上故意抛出的自定义错误.
当我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"}
其中我能够访问错误属性.
有什么不同?
是否在代码中看到了差异?像字符串一样只是作为字符串和对象传递给对象,但语法会有所不同吗?
我没有探索过抛出错误对象......我只是抛出了字符串.
还有除上述两种方法之外的其他方法吗?
我正在和一位同事讨论如何从构造函数中抛出异常,并且我想要一些反馈.
从设计的角度来看,从构造函数中抛出异常是否可以?
假设我在一个类中包装一个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++中,您可以通过使用异常说明符指定函数可能会也可能不会抛出异常.例如:
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)
由于以下因素,我对实际使用它们表示怀疑:
你认为应该使用异常说明符吗?
请回答"是"或"否"并提供一些理由来证明您的答案.
为什么我不能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
会被黑洞吞噬?
我在我的一个简短的尝试中选择了这个来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.
我一直看到有人说异常很慢,但我从来没有看到任何证据.因此,我不会询问它们是否存在,而是会询问异常是如何在场景背后起作用的,因此我可以决定何时使用它们以及它们是否很慢.
据我所知,异常与做一堆返回是一回事,但它也会检查何时需要停止返回.它如何检查何时停止?我正在猜测并说有一个第二个堆栈,其中包含异常类型和堆栈位置然后返回直到它到达那里.我也猜测堆栈触摸的唯一时间是抛出和每次尝试/捕获.使用返回代码实现类似行为的AFAICT将花费相同的时间.但这都是猜测,所以我想知道.
例外如何真正起作用?
有没有之间的任何其他差别throw()
和noexcept
除了被检查的运行时分别编译时间?
维基百科C++ 11文章表明不推荐使用C++ 03 throw说明符.
为什么这样,noexcept
有足够的能力在编译时覆盖所有这些?
我有一个例外发生异常的功能
private void functionName() throws Exception
{
// some code that might throw an exception
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
传统观点认为你只能抛出Throwable
用Java 扩展的对象,但是有可能禁用字节码验证器并让Java编译并运行抛出任意对象的代码 - 甚至是原语吗?
我查看了JVM athrow
,它将在操作数堆栈上弹出第一个objref; 但它会检查所述参考是否指向Throwable
运行时?
我有一个foo
可以抛出bar
异常的函数.
在我调用的另一个函数中,foo
但是bar
如果抛出,我可以向异常添加更多细节.(foo
由于该函数的通用特性,我宁愿不将这些信息作为参数传递给它,因为它并不真正属于那里.)
所以我在调用者中这样做:
try {
foo();
} catch (bar& ex){
ex.addSomeMoreInformation(...);
throw;
}
Run Code Online (Sandbox Code Playgroud)
会throw
重新抛出修改过的异常还是我需要使用throw ex;
?后者可能会采用有价值的副本,所以我宁愿不这样做.还会throw
带一个价值副本吗?我怀疑它不会.
(我知道我可以验证,但我担心绊倒一个未指定或未定义的构造,所以想知道肯定).
throw ×10
exception ×7
c++ ×6
java ×2
javascript ×2
asynchronous ×1
c# ×1
c++11 ×1
constructor ×1
es6-promise ×1
function ×1
noexcept ×1
object ×1
performance ×1
promise ×1
specifier ×1
throws ×1
try-catch ×1