Cos*_*sta 25 javascript error-handling node.js
我有一个小模块,可以作为我数据的模型.它位于我的路由和我的数据库之间,用于存储特定数据(在我的情况下是用户数据).
我在路由代码中需要此模块,调用subscribe
它具有的方法,并通过将所需数据存储在我的数据库中来订阅用户到特定邮件列表.好极了!
我的"订阅"方法接受电子邮件和电子邮件列表ID作为两个参数.我将编码草率和快速并为不存在的列表输入id是合理的.拼写错误,你说出来.
如何抛出错误并指向具有错误ID的行号?
来自model/user.js内部的代码:
if (emailLists.indexOf(listId) === -1) {
throw new Error('listId does not exist');
}
Run Code Online (Sandbox Code Playgroud)
来自route.js内部的代码:
user.subscribe('fake@email.com', 'knewsletterr', function (error, success) {
if (error) { return sendResponse(500, 'Ahhhhhhh!'); }
if (!error) { return sendResponse(200, 'subscribed'); }
});
Run Code Online (Sandbox Code Playgroud)
现在,我得到:
/home/.../project/models/user.js:85
if (emailLists.indexOf(listId) === -1) { throw new Error('listId does not exist'); }
^
Error: listId does not exist
Run Code Online (Sandbox Code Playgroud)
Tha*_*you 29
如果你正在使用节点式回调,那么约定不是throw
,而是将错误作为回调的第一个参数传递给你
// divide with callback
function div (x, y, done) {
if (y === 0)
return done (Error ('Cannot divide by zero'))
else
return done (null, x / y)
}
div (6, 3, function (err, result) {
// *always* check for err
if (err)
console.log ('error', err.message, err.stack)
else
console.log ('result', result)
})
Run Code Online (Sandbox Code Playgroud)
一种使用回调的愚蠢函数,因为它可以以纯粹的同步方式编写,但希望这说明了模式
您的函数可能已经以同步方式编写 - 不用担心,我们可以使用cps2
下面的代码将它转换为节点式回调函数
// a "normal" synchronous function that throws an error
const div = (x, y) =>
{ if (y === 0)
throw Error ('cannot divide by zero')
else
return x / y
}
// convert it to a continuation passing style (cps) function
const cps2 = (f, x, y, k) =>
{ try
{ return k (null, f (x, y)) }
catch (err)
{ return k (err) }
}
// logging utility for demos below
const logger = (err, result) =>
{ if (err)
console.log ('error:', err.message, err.stack)
else
console.log ('result:', result)
}
cps2 (div, 6, 3, logger)
// result: 2
cps2 (div, 6, 0, logger)
// error: cannot divide by zero
Run Code Online (Sandbox Code Playgroud)
所有这些都说,现在大多数人都在使用Promise
// a conventional function with a node-style callback
const div = (x, y, done) =>
{ if (y === 0)
return done (Error ('cannot divide by zero'))
else
return done (null, x / y)
}
// convert a node-style callback function to a promise-returning function
const promisify = f => (...args) =>
new Promise
( (resolve, reject) =>
f ( ...args
, (err, result) =>
err
? reject (err)
: resolve (result)
)
)
// logging utility for demos below
const logger = p =>
p .then (console.log, console.error)
logger (promisify (div) (6, 3))
// 2
logger (promisify (div) (6, 0))
// Error: cannot divide by zero
Run Code Online (Sandbox Code Playgroud)
Continuations只是函数,所以你可以用你喜欢的任何方式编写这种东西 - 不要认为你必须使用节点式的"回调"或Promise只是因为这是你看到它的唯一方式
const cont = (...values) =>
k => k (...values)
const div = (x, y) =>
y === 0
? cont (Error ('cannot divide by zero'))
: cont (null, x / y)
const logger = (err, result) =>
err
? console .log ('error:', err.message)
: console .log ('result:', result)
div (6, 3) (logger)
// result: 2
div (6, 0) (logger)
// error: cannot divide by zero
Run Code Online (Sandbox Code Playgroud)
这会对你有所帮助!
var el = document.getElementById('el');
var log = function( val ){
el.innerHTML+= '<div><pre>' + val + '</pre></div>';
};
try {
throw Error('error in code');
} catch (e) {
log( e.message );
log( e.fileName );
log( e.lineNumber );
log( e.stack );
};
Run Code Online (Sandbox Code Playgroud)
<div id='el'></div>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
64358 次 |
最近记录: |