以下是最适合在 Chrome Devtools、Node.js 等中显示自定义错误的代码。基于此 StackOverflow 答案。
function CustomErr (message) {
var err = new Error(message)
Object.setPrototypeOf(err, CustomErr.prototype)
return err
}
CustomErr.prototype = Object.create(Error.prototype, {
name: { value: 'Custom Error', enumerable: false }
})
Run Code Online (Sandbox Code Playgroud)
但是,当我将其转换为 Typescript 时:
function CustomErr (message: string) {
var err = new Error(message)
Object.setPrototypeOf(err, CustomErr.prototype)
return err
}
CustomErr.prototype = Object.create(Error.prototype, {
name: { value: 'Custom Error', enumerable: false }
})
Run Code Online (Sandbox Code Playgroud)
调用throw new CustomErr("something went wrong")显示此错误:
'new' expression, whose target lacks a construct …Run Code Online (Sandbox Code Playgroud) 假设我有一个仅接受非负数的函数,而我却得到了负数。
在Python中,我会提出一个ValueError。在Java中,我会抛出IllegalArgumentException。我应该在JavaScript中抛出任何内置的异常,还是应该返回undefined?
我正在构建一个API(使用Expressjs v4),通常我在路由中处理错误而不是使用中间件.例如:
router.use('/', function(req, res, next) {
...
if (err)
return res.status(500).send({type: "serverError", message: "Something has gone wrong on our end."});
}
Run Code Online (Sandbox Code Playgroud)
我现在意识到中间件是"走的路".我在Expressjs网站上看到了相当有限的文档:http://expressjs.com/guide/error-handling.html 但仍然不确定一些事情.
我添加了server.js:
function errorHandler(err, req, res, next) {
}
Run Code Online (Sandbox Code Playgroud)
但我该如何处理不同类型的错误(400,404,500等)?
每次发生错误时,我发现自己写了3行代码:
//A route
var err = new Error();
err.status = 404;
return next(err);
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方式访问状态:
function errorHandler(err, req, res, next) {
console.log(err.status);
if(err.status == "400")
//do something
else
//etc etc
}
Run Code Online (Sandbox Code Playgroud)
当然有比这更简单的方法吗?我错过了什么吗?
在JavaScript方法中抛出InvalidArgumentException,就像在Java或类似语言中一样.
我一直在努力熟悉JavaSctipt错误处理,我知道我可以使用throw关键字抛出异常.
为此,我还阅读了MDN上的throw文档和MDN上的Error文档.
到目前为止这是我的代码:
if (mySize >= myArray.length)
throw new Error("InvalidArgumentExcpetion - BANG!!!!");
Run Code Online (Sandbox Code Playgroud)
这段代码对我来说有些问题:
所以现在我很困惑.
我希望 Chrome Dev Tools 以Error与本机浏览器错误相同的用户友好格式记录我的自定义错误对象(扩展)。
目前如下代码:
console.log(new CustomError('boom'));
console.log(new Error('boom'));
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
相反,我希望我的自定义错误类型与省略号 ( ...) 堆栈跟踪一起显示,并且在展开时可以方便地单击文件路径。
我当前的错误实现是MDN 自定义错误类型文档中建议的扩展方法,尽管我也尝试过这个和这个Stack Overflow 的答案。
带有附加captureStackTrace支持的 MDN 实现是:
function CustomError(message) {
this.message = message;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor)
} else {
this.stack = new Error().stack;
}
}
Object.setPrototypeOf(CustomError, Error);
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.name = "CustomError";
CustomError.prototype.message = "";
CustomError.prototype.constructor = CustomError;
Run Code Online (Sandbox Code Playgroud)
有没有办法让 Chrome Dev Tools 将我的自定义错误视为标准错误?
我正在开发一个具有不同类型的错误、服务和域概念的复杂应用程序。
为了引发“对象”错误,我想到了两种不同的方法:
Object.assign()Error 对象(如果我只需要抛出遵循此形式的一个或几个错误,这是一个简单的选择):function f() {
const err = new Error();
Object.assign(err, {
name: "ServiceError",
code: "service/some-string-code",
message: "Some message",
});
throw err;
}
try {
f();
} catch(err) {
console.log(err instanceof Error);
}Run Code Online (Sandbox Code Playgroud)
class MyServiceError extends Error {
constructor(code, message) {
super(message);
this.name = "ServiceError";
this.code = code;
}
}
function f() {
const err = new MyServiceError("service/some-string-code", "Some message");
throw err;
}
try {
f();
} catch(err) {
console.log(err instanceof Error);
console.log(err …Run Code Online (Sandbox Code Playgroud)javascript ×6
exception ×2
node.js ×2
ecmascript-5 ×1
express ×1
idioms ×1
throw ×1
typescript ×1