分层项目中,有上层调用下层,每一层都可能出错,比如数据库连接,文件读写等异常。除了运行时程序的异常,还有业务逻辑的一些问题。发生异常需要做一定处理,既要让开发人员便于排查问题,又要让用户看到友好又便于理解的信息。

对于底层连接数据库,操作数据库的数据层,异常捕捉后,可以记录日志,日志可以是当前文件,行号,sql语句,参数,错误的详情等。然后再往上层抛异常,在控制器层捕捉,判断后返回给用户客户端恰当的便于理解的错误信息。这个信息是根据业务模块功能具体来确定的。比如用户模块的新增功能,当用户名重复的时候,可以提示‘用户名已存在’,比‘操作失败,请重试’要直观,当然这是业务逻辑的异常,程序异常也类似。

通常可以自定义自己的异常类型,作为底层的异常抛到上层去。上层可以集中配置一个异常信息对照表,或错误码表,根据返回的异常,查找对应的用户提示信息,并返回。

常见的控制层代码段如下:

try{

//model();

}catch(Exception e){

  //print();

  //log('文件-行号-异常信息');

//return '根据e的类型,返回用户友好的信息提示';

}

每个controller都有类似的代码,所以可以把这个处理逻辑搬到拦截器或者调度器里,然后根据异常类型或异常错误号,再对应集中返回信息。

至于log记录,则根据情况来分析,实际业务访问量,系统规模架构等都有很大影响。一般是记录在文件,队列,日志型数据库等。

层层抛出、上层捕捉、详情记录、友好返回、异常信息对照表

写在开始前---web异常处理的更多相关文章

  1. 写在开始前---web前后端对接

    现阶段接口对接问题: 1.接口乱,不清晰明了,无文档或文档过期 2.接口和业务不匹配.不可用 3.前后端沟通,工程复杂化 4.不能深入了解业务 5.任务延期 注:前后端对业务深入了解,接口之间都是有联 ...

  2. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  3. PyQt写的浏览单web页面的browser - 开源中国社区

    PyQt写的浏览单web页面的browser - 开源中国社区 PyQt写的浏览单web页面的browser

  4. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  5. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  6. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

  7. 如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

  8. [翻译]如何用YII写出安全的WEB应用

    前言 虽然本文是基于YII1.1,但其中提到的安全措施适用于多数web项目安全场景,所以翻译此文,跟大家交流.原文地址. 目录 安全基本措施... 2 验证与过滤用户的输入信息... 2 原理... ...

  9. 一文带你掌握Spring Web异常处理方式

    一.前言 大家好,我是 去哪里吃鱼 ,也叫小张. 最近从单位离职了,离开了五年多来朝朝夕夕皆灯火辉煌的某网,激情也好悲凉也罢,觥筹场上屡屡物是人非,调转过事业部以为能换种情绪,岂料和下了周五的班的前同 ...

随机推荐

  1. 3ds max学习笔记(八)-- 实例操作(直行楼梯)

    1.选择要复制的物体,执行[工具]/[阵列]命令,弹出对话框: 2.参数说明: 应用: 1.[自定义]/[单位设置],将单位改为mm 在顶视图中,创建长方体,长1600,宽300,高度150 2.在前 ...

  2. Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  3. java内部类(一)

    内部类(一) 一.定义: 内部类就是定义在另一个类内部的类,与之对应,包含内部类的类就是外部类. 二.作用: 1.内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包之中的其他类访问该类 ...

  4. ssh以root用户远程登录失败

    参考文献: http://blog.csdn.net/lichangzai/article/details/39379153 http://blog.csdn.net/yasi_xi/article/ ...

  5. 分布式一致性hash算法

    写在前面  在学习Redis的集群内容时,看到这么一句话:Redis并没有使用一致性hash算法,而是引入哈希槽的概念.而分布式缓存Memcached则是使用分布式一致性hash算法来实现分布式存储. ...

  6. Linux Performance Profiling & Visualization

    https://github.com/figozhang/CLK/tree/master/CLK2016 http://www.linuxep.com/

  7. Python3 与 NetCore 基础语法对比(Function专栏)

    Jupyter最新排版:https://www.cnblogs.com/dotnetcrazy/p/9175950.html 昨晚开始写大纲做demo,今天牺牲中午休息时间码文一篇,希望大家点点赞 O ...

  8. C# ManualResetEventSlim 实现

    ManualResetEventSlim通过封装 ManualResetEvent提供了自旋等待和内核等待的组合.如果需要跨进程或者跨AppDomain的同步,那么就必须使用ManualResetEv ...

  9. CentOS7.2网络配置

    修改hostname vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain ...

  10. docker占满linux磁盘根目录的解决办法

    一.磁盘根目录被占满 [test@localhost docker]$ df -lh Filesystem Size Used Avail Use% Mounted on /dev/mapper/ce ...