Skip to content

Instantly share code, notes, and snippets.

@42thcoder
Created March 20, 2016 13:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 42thcoder/46a9cca86fd5dfa59dc8 to your computer and use it in GitHub Desktop.
Save 42thcoder/46a9cca86fd5dfa59dc8 to your computer and use it in GitHub Desktop.
handle exception the right way with async/await && promise && express
//测试 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