后端异常处理

本系统封装了一些常用的异常处理类,并使用GlobalExceptionHandler类对异常进行统一处理,使用异常处理模块如下图:

异常处理 - 图1

前端异常处理

在前端的 src/utils/request.js 文件中对所有的request请求进行拦截,通过 response 拦截器对接口返回的状态码进行分析与异常拦截

  1. // response 拦截器
  2. service.interceptors.response.use(
  3. response => {
  4. const code = response.status
  5. if (code < 200 || code > 300) {
  6. Notification.error({
  7. title: response.message
  8. })
  9. return Promise.reject('error')
  10. } else {
  11. return response.data
  12. }
  13. },
  14. error => {
  15. let code = 0
  16. try {
  17. code = error.response.data.status
  18. } catch (e) {
  19. if (error.toString().indexOf('timeout')) {
  20. Notification.error({
  21. title: '请求超时',
  22. duration: 2500
  23. })
  24. return Promise.reject(error)
  25. }
  26. }
  27. if (code === 401) {
  28. MessageBox.confirm(
  29. '登录状态已失效,你可以取消继续留在该页面,或者重新登录',
  30. '提示',
  31. {
  32. confirmButtonText: '重新登录',
  33. cancelButtonText: '取消',
  34. type: 'warning'
  35. }
  36. ).then(() => {
  37. store.dispatch('LogOut').then(() => {
  38. location.reload() // 为了重新实例化vue-router对象 避免bug
  39. })
  40. })
  41. } else if (code === 403) {
  42. router.push({ path: '/401' })
  43. } else {
  44. const errorMsg = error.response.data.message
  45. if (errorMsg !== undefined) {
  46. Notification.error({
  47. title: errorMsg,
  48. duration: 2500
  49. })
  50. }
  51. }
  52. return Promise.reject(error)
  53. }
  54. )