在 Chrome 中,当发生异常时,它会将堆栈跟踪打印到控制台日志。这非常有用,但不幸的是,在重新抛出异常的情况下,这会导致问题。
} catch (e) {
if (foo(e)) {
// handle the exception
} else {
// The stack traces points here
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,jQuery.js如果它们来自内部事件处理程序,以下代码会导致所有异常都出现此问题。
try {
while( callbacks[ 0 ] ) {
callbacks.shift().apply( context, args );
}
}
// We have to add a catch block for
// IE prior to 8 or else the finally
// block will never get executed
catch (e) {
throw e;
}
finally {
fired = [ context, …Run Code Online (Sandbox Code Playgroud) 我想我知道我的意思,但我不太确定......
Framework 文档总结了该类型如下:
当方法调用对于对象的当前状态无效时抛出的异常。
有明确的情况,我想到的情况是当操作需要打开数据库但对象尚未使用连接到数据库所需的信息进行初始化时。
(切线:另一方面,ADO.NETs 还要求您显式打开连接的行为并不那么明确;DataAdapter 通过简单地打开连接 instad 与此不同,当且仅当它关闭时再次关闭它条目,我发现这很方便,并让自己成为一个 ADO.NET 包装器,该包装器对所有内容都使用此模式。当然,这意味着我冒着执行 2 ExecuteNonQuery 并不必要地将连接返回到两者之间的池的风险,但我仍然可以打开和关闭与获得异常相比,我想要的连接和这种性能损失算不了什么。)
我想我的问题的答案是,只有在这种明确的情况下,我们才应该抛出异常。但是在以下场景中哪种异常类型最合适:
public class FormatterMapping
{
Dictionary formattersByName = new ...();
public IFormatter GetFormatter(string key)
{
IFormatter f;
if (formattersByName.TryGetValue(key, out f))
return f;
else
throw new ??Exception("explanation of why this failed.");
}
}
我的第一反应是抛出 ArgumentException。然后我开始认为映射缺少一个键也可能与参数“错误”一样。基本上“获取格式化程序 X”操作是无效的,因为X 不在映射中,但我真的不知道 X 是否“应该在那里”或者在这里要求 X 是不明智的。
我当然可以通过返回 null 来规避整个问题,但这会打开一个更大、更深的蠕虫罐头。没有办法知道什么时候会使用返回值,所以稍后因 NullReferenceException 而爆炸的代码可能与出错的地方没有明显的关系。要么映射设置不当,要么使用它的代码要求一些不应该的东西。
避免该问题的另一种方法是使用 TryGetFormatter 选项,但我打算使用它的方式实际上调用者应该知道映射中的内容和不包含的内容,因此在用户代码上强制使用此模式不是也不错。
请不要回答我应该抛出 ApplicationException!无论您认为代码应该做什么,请提供原因。毕竟,这里真正有问题的是推理。
除非有人说服我,否则我倾向于 ArgumentException。从映射的角度来看,这个论点是错误的,所以至少有一个明确的推理支持这一点。:)
我试图在 Javascript 中了解 OOP(我也从未真正在任何其他语言中使用过 OOP,所以这是我的第一次体验)。我编写了一个需要构造函数输入的类,但构造函数仅适用于特定格式的字符串。
我有一个正则表达式可以用来检查输入,但我不知道如果它不匹配(或者根本没有输入)我应该怎么做。我应该抛出某种异常吗?如果是这样,我该怎么做?
我有一个附加到 window.onerror 的函数
window.onerror = function(errorMsg, url, line) {
window.alert('asdf');
};";
Run Code Online (Sandbox Code Playgroud)
这在 firefox、chrome 和 IE 中工作正常,但在 safari 中不起作用。通过一些挖掘,我在某处读到 safari 不支持 onerror。然而,这个帖子已经有几年了。safari 目前支持 onerror 吗?
如果没有,是否有解决方法?
我试图从ES6生成器函数的主体抛出一个异常,但它没有通过.这是ES6规范的一部分还是Babel的怪癖?
这是我尝试过的代码(在babeljs.io上):
function *gen() {
throw new Error('x');
}
try {
gen();
console.log('not throwing');
} catch(e) {
console.log('throwing');
}
Run Code Online (Sandbox Code Playgroud)
如果确实指定了ES6行为,那么发出异常信号的替代方法是什么?
我正在开发一个需要与现有 Objective-C api 交互的 swift 项目。不过,我在使用其中一个功能时遇到了一些障碍。在objective-c 头文件(OrderItem.h)中,我有这个函数定义:
+ (NSString *_Nullable)getOptional:(NSString *_Nonnull)foo error:(NSError *_Nullable *_Nullable)error;
Run Code Online (Sandbox Code Playgroud)
特别要注意最后一个参数;因为它是一个错误指针,在 swift 中调用此方法将需要包含在错误处理程序中(do .. catch)。
这是相应的 .m 文件:
+ (NSString *)getOptional:(NSString *)foo error:(NSError *__autoreleasing *)error
{
if([foo isEqualToString:@"abc"])
{
return @"abc item";
}
else
{
if([foo isEqualToString:@"xyz"])
{
*error = [[NSError alloc] init];
}
return nil;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的 swift 文件中,我添加了以下代码:
func testGetOptional()
{
do
{
var result:NSString? = try OrderItem.getOptional("abc");
XCTAssertNotNil(result);
result = try OrderItem.getOptional("123");
XCTAssertNil(result);
}
catch let error as NSError
{
XCTFail("OrderItem lookup …Run Code Online (Sandbox Code Playgroud) 我怎样才能正确投掷?它是连线的,对于同一个函数,throw和not.throw 都通过了测试
jsfiddle 上也提供了代码,https: //jsfiddle.net/8t5bf261/
class Person {
constructor(age) {
if (Object.prototype.toString.call(age) !== '[object Number]') throw 'NOT A NUMBER'
this.age = age;
}
howold() {
console.log(this.age);
}
}
var should = chai.should();
mocha.setup('bdd');
describe('Person', function() {
it('should throw if input is not a number', function() {
(function() {
var p1 = new Person('sadf');
}).should.not.throw;
(function() {
var p2 = new Person('sdfa');
}).should.throw;
})
})
mocha.run();Run Code Online (Sandbox Code Playgroud)
<div id="mocha"></div>
<link href="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.4.5/mocha.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/jquery/jquery/2.1.4/dist/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.4.5/mocha.min.js"></script> …Run Code Online (Sandbox Code Playgroud)我知道 stackoverflow 充满了类似的问题,我已经阅读了很多。
从我在throw里面得到的一个承诺应该拒绝它,正如我在文档中所读到的:
如果 executor 抛出异常,它的值将传递给拒绝解析函数。
但是即使在阅读了很多关于 promise 和 throw 的帖子之后,我仍然不明白我粘贴的代码片段以及它为什么会发生。
function foo(a, b, cb) {
setTimeout(() => {
cb('Inner error *!?"$%&#@"');
}, 0);
}
const getThePromise = () => {
return new Promise((resolve, reject) => {
const cb = (err) => {
/* >>> ************ */
throw err; // catch not called
// reject(err); // catch called
/* ************ <<< */
}
foo('foo', 'dudee', cb);
});
}
getThePromise()
.catch((err) => {
console.log('CATCH:', err);
}) …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个代码,当它与我的计算机在同一网络上时,它将返回我的覆盆子的IP.这个想法是让它像Samba一样进行广播(广播解析是最接近原始NetBIOS机制的.基本上,寻找名为Trillian的服务的客户会喊出"哟!Trillian!你在哪里?",等待具有该名称的机器以IP地址回答.来源:Samba团队)
所以这是代码:
public class GetIP {
static String url; //global so I can access it after the threads are finished
public class CheckIP extends Thread {
private String url_test;
public CheckIP(String url_t) {
url_test = url_t;
}
public void run(){
try {
result = getHTML(this.url_test); //result = the response from the GET request to this.url_test
} catch (Exception e) {
}
if(result <is what I want>) {
url = this.url_test
System.out.println("Flag 1");
<I'd like to do something here, preferebly kill …Run Code Online (Sandbox Code Playgroud) 我正在尝试逐步完成C ++程序。它在较低的层中引发了异常,但是我无法让gdb调试器将我带到catch语句。一种解决方法是向其注册捕获点,(gdb) catch catch但是必须记住始终这样做很笨拙,这将导致程序在较低层的每个捕获语句链处暂停。
这是一个复制品,以说明我的观点。对于用g++ foo.cpp -g -o foo.. 编译的程序
#include <cstdio>
void f() {
throw 42;
}
int main(int argc, char *argv[])
{
try {
throw 42;
//f();
printf("after throw\n");
} catch (...) {
printf("in catch stmt\n");
}
printf("after try-catch stmt\n");
}
Run Code Online (Sandbox Code Playgroud)
.. Gdb的工作与我预期的一样:当我跨过throw语句时,下一条语句就是catch。
$ gdb -q foo
Reading symbols from foo...done.
(gdb) start
Temporary breakpoint 1 at 0x912: file foo.cpp, line 9.
Starting program: /home/dannas/foo
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdd88) at foo.cpp:9
9 …Run Code Online (Sandbox Code Playgroud) throw ×10
javascript ×6
exception ×3
class ×2
ecmascript-6 ×2
try-catch ×2
.net ×1
babeljs ×1
c++ ×1
chai ×1
continue ×1
gdb ×1
generator ×1
java ×1
java-threads ×1
node.js ×1
objective-c ×1
onerror ×1
oop ×1
optional ×1
promise ×1
safari ×1
stack-trace ×1
swift ×1