我用 try-catch 块包裹,但应用程序崩溃了
Posted
技术标签:
【中文标题】我用 try-catch 块包裹,但应用程序崩溃了【英文标题】:I wrapped with try-catch block but app crashed 【发布时间】:2019-07-25 12:59:27 【问题描述】:我试图在以下语法中抛出错误:
if(err) throw err
我希望通过“console.log(err)”行打印日志,而不是应用程序崩溃。
但是,这会发生应用程序崩溃并显示错误
throw err; // Rethrow non-mysql errors
^
Error: Error: ER_DUP_ENTRY: Duplicate entry 'test4' for key 'nickname_UNIQUE'
我无法弄清楚为什么会发生这种情况,需要专家的帮助。
代码:
api.post('/', (req, res) =>
const email = req.body.email
const nickname = req.body.nickname
const password = req.body.password
const thumbnail = req.file
const type = req.body.type
const hasherCallback = (err, pass, salt, hash) =>
if (err) throw err
const sql = `INSERT INTO users set ?`
const fields = nickname, email, 'password': hash, salt, thumbnail, type
const queryCallback = (err) =>
if (err) throw err
return res.json(messages.SUCCESS_MSG)
conn.query(sql, fields, queryCallback)
try
return hasher( password , hasherCallback)
catch (err)
//handle errors here
console.log(err)
)
return api
//Error : Error: Error: ER_DUP_ENTRY: Duplicate entry 'test4' for key 'nickname_UNIQUE'
【问题讨论】:
【参考方案1】:throw 语句引发用户定义的异常。您的函数的执行将停止,从此时起不会执行任何操作。
有关 throw 关键字的帮助,请参见 this 网站。还要花时间阅读 throw new Error,因为这可能是您需要的,而不是 throw。这个link也可能有帮助
就错误发生的原因而言,MySQL 错误告诉您正在将重复数据插入到用户表中。数据库拒绝它,因为表中已经存在一条昵称值为“test4”的记录......所以您不能将另一个昵称为“test4”的用户插入表中。
为什么你会问? 这是因为您在表上有一个索引,要求昵称是唯一的。
您可以使用的两个选项如下:
-
向您的 javascript 添加更多代码,告诉您的用户,如果该昵称已被其他用户使用,请请求他们选择另一个昵称并重试。
如果您想允许多次插入相同的昵称,请通过删除表上的唯一昵称要求来允许重复昵称。为此,您需要修改表上的索引。如果您的其他表字段没有唯一值,这可能很危险且不适合。
祝你好运,编码愉快。
【讨论】:
【参考方案2】:我发现我无法在异步函数中抛出错误,所以我尝试使用回调。
api.post('/', (req, res) =>
const email = req.body.email
const nickname = req.body.nickname
const password = req.body.password
const thumbnail = req.file
const type = req.body.type
const errorHandle = (callback) =>
const hasherCallback = (err, pass, salt, hash) =>
if (err) return callback(err)
const sql = `INSERT INTO users SET ?`
const fields = nickname, email, 'password': hash, salt, thumbnail, type
const queryCallback = (err) =>
if (err) return callback(err)
return res.json(messages.SUCCESS_MSG)
conn.query(sql, fields, queryCallback)
return hasher( password , hasherCallback)
return errorHandle((err) =>
//This one equals console.log( status: 'error' message: err )
return res.status(500).json(messages.ERROR(err))
)
)
这会打印我想要的日志,而不是应用程序崩溃。
"status": "error",
"message":
"code": "ER_DUP_ENTRY",
"errno": 1062,
"sqlMessage": "Duplicate entry 'test4' for key 'nickname_UNIQUE'",
"sqlState": "23000",
"index": 0,
"sql": "INSERT INTO users SET `nickname` = 'test4', `email` = 'test4@test.com', `password` = 'FXxSpPBNFfL1KGS0sWn19N191Hj0FXtnCWwMspneVIvwB5UgPBI0MjBskEnHby357j/3VKWM7ffi/5yD5CiIRyAGMWnTaStzbVX/hhD1/y91UW9b8etWpV5koKcn9QsmD9BozX1+wkve66lTNoFUHDWA0BDj4j8O7ltsD4698LQ=', `salt` = 'cu7GlOjK4drxV/SD4CBJtiW5yirc5/TpaAroCBbCQtOy4Asr8rGvTrxArXHmPH6ADTtHlXvUEEoeUD73LS654Q==', `thumbnail` = NULL, `type` = 'local'"
【讨论】:
以上是关于我用 try-catch 块包裹,但应用程序崩溃了的主要内容,如果未能解决你的问题,请参考以下文章
在 try-catch 块中包装循环会导致性能问题吗? [复制]