Created
March 20, 2016 13:18
-
-
Save 42thcoder/46a9cca86fd5dfa59dc8 to your computer and use it in GitHub Desktop.
handle exception the right way with async/await && promise && express
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//测试 express && async 的异常处理 | |
import express from 'express'; | |
let router = express.Router(); | |
function badass() { | |
return new Promise(async(resolve, reject)=> { | |
console.log('before throw error'); | |
throw new Error('test'); | |
console.log('after throw error'); | |
}); | |
} | |
function mistake() { | |
return new Promise(async(resolve, reject)=> { | |
console.log('before throw error'); | |
return reject(new Error('test')); // reject 并不会中断执行 | |
console.log('after throw error'); | |
}); | |
} | |
function weired_mistake() { | |
return new Promise(async(resolve, reject)=> { | |
console.log('before throw error'); | |
resolve(new Error('test')); | |
console.log('after throw error'); | |
}); | |
} | |
function decent_mistake() { | |
return new Promise(async (resolve, reject)=>{ | |
try { | |
console.log(resolve.toString()); | |
console.log(reject.toString()); | |
console.log('before throw error'); | |
throw new Error('test'); | |
console.log('after throw error'); | |
} catch (e) { | |
console.error('catch error'); | |
return resolve(e); | |
} | |
}); | |
} | |
// 僵死, 之后进程自动重启 | |
//before await | |
//before throw error | |
router.route('/') | |
.get(async (req, res, next) => { | |
console.log('before await'); | |
let data = await badass(); | |
console.log('after await', data); | |
res.end(); | |
}); | |
// 僵死 | |
//before await | |
//before throw error | |
router.route('/catch') | |
.get(async(req, res, next)=> { | |
try { | |
console.log('before catch await'); | |
let data = await badass(); | |
console.log('after await', data); | |
} catch (e) { | |
console.error(e); | |
} finally { | |
res.end(); | |
} | |
}); | |
// 僵死 | |
//before await | |
//before throw error | |
router.route('/mistake') | |
.get(async (req, res, next) => { | |
console.log('before await'); | |
let data = await mistake(); | |
console.log('after await', data); | |
res.end('done'); | |
}); | |
// 不是很正常, 因为 mistake | |
//before catch await | |
//before throw error | |
//after throw error | |
// [Error: test] | |
router.route('/mistake/catch') | |
.get(async(req, res, next)=> { | |
try { | |
console.log('before catch await'); | |
let data = await mistake(); | |
console.log('after await', data); | |
res.end(); | |
} catch (e) { | |
console.error(e); | |
} finally { | |
res.end('done'); | |
} | |
}); | |
// 正常, 但是无用, await 中出现了异常, 但是并没有中断接口的执行 | |
//before await | |
//before throw error | |
//after throw error | |
//after await [Error: test] | |
router.route('/weired_mistake') | |
.get(async (req, res, next) => { | |
console.log('before await'); | |
let data = await weired_mistake(); | |
console.log('after await', data); | |
res.end('done'); | |
}); | |
// 可以处理真正的异常 | |
//before await | |
//before throw error | |
//catch error | |
//after await [Error: test] | |
router.route('/decent_mistake') | |
.get(async (req, res, next) => { | |
console.log('before await'); | |
let data = await decent_mistake(); | |
console.log('after await', data); | |
res.end('done'); | |
}); | |
module.exports = router; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment