`
zhang_xzhi_xjtu
  • 浏览: 538539 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个异常应该在一个log文件里面出现一次且只有一次

阅读更多
系统报了一堆异常,吓人一跳,看了看,发现有一个异常在同一个文件中,打了多次的情况。
比如A->B,B->C,C系统有一个异常,打到了error.log中,然后又向上抛,B捕获了这个异常,打到了error.log中,又向上抛,C系统捕获了这个异常,打到了error.log中。

感觉这种记录异常的方式是不合理的。

当时这么做的思路是所有的异常打在一个文件里面,方便排查故障。

但是这种一个root cause的异常在同一个文件打多次应该是不必要的。

传统的做法是一个异常只打一次log,但是这个只是一个理想情况,我的想法是,一个系统对于同一个root cause的异常只应该记录一次。

以上面的例子为例,C把异常打到c.error.log中,抛出去,B把异常打到b.error.log中,抛出去,A把异常打到a.error.log中。同时,所有的异常应该保留异常堆栈,这样,不论是在A还是B还是C都可以看到这个异常的真正的root cause。
分享到:
评论
25 楼 zhang_xzhi_xjtu 2010-11-28  
gdpglc 写道
zhang_xzhi_xjtu 写道
false,null是返回值,是正常流程的一部分,不是异常流。

这算总原则吧,我不反对。
不过,我想的说的是:事情要具体情况具体分析,不可教条。某些事情,算什么是分不清楚的,比如:hibernate的load和get方法,功能一样,但找不到对象时,前者会抛异常,后者返回null。

软件有规则的一面,也有复杂多变的一面,很多简单的原则在软件开发上,都是有适用范围的。在应用软件开发的指导性原则时,一定要了解它的前因后果,防止在错误的上下文下应用某个设计原则,那只能是事倍功半。




同意你说的事情要具体情况具体分析,不可教条。

hibernate的load和get方法,功能一样,但找不到对象时,前者会抛异常,后者返回null。

这个设计不觉的很奇怪吗?

如果你不假思索的说这个好,并且以这个为参照物的话,是不是教条(迷信框架)了。
24 楼 gdpglc 2010-11-28  
zhang_xzhi_xjtu 写道
false,null是返回值,是正常流程的一部分,不是异常流。

这算总原则吧,我不反对。
不过,我想的说的是:事情要具体情况具体分析,不可教条。某些事情,算什么是分不清楚的,比如:hibernate的load和get方法,功能一样,但找不到对象时,前者会抛异常,后者返回null。

软件有规则的一面,也有复杂多变的一面,很多简单的原则在软件开发上,都是有适用范围的。在应用软件开发的指导性原则时,一定要了解它的前因后果,防止在错误的上下文下应用某个设计原则,那只能是事倍功半。


23 楼 zhang_xzhi_xjtu 2010-11-28  
false,null是返回值,是正常流程的一部分,不是异常流。
22 楼 gdpglc 2010-11-28  
zhang_xzhi_xjtu 写道

1,2 我认为以false和null这个处理方式是个设计的败笔。忽略的话,很多人catch住一样忽略,你是防不住的。

败在何处?
21 楼 zhang_xzhi_xjtu 2010-11-28  
gdpglc 写道
linliangyi2007 写道
我觉得这个问题的关键是,系统在哪个层面上拦截/处理异常?
从设计上说,层层往上抛异常,层层记录,却不处理,这样的设计有缺陷的。

底层的异常应该对上层屏蔽,外部API调用可能得到一个false或者null的结果,但不是异常本身。


1.请问底层的民常上层屏蔽的目的是什么?

2.以false和null表达异常,我觉得不合适。调用者很可能会忽略对异常的处理。

3.打印日志,我建议,catch异常的就要进行记录。在多人合作的情况下,这样的规则最容易统一,必免出现异常出现而不记录的情况。多看点日志对个程序员来说,也不算啥。



1,2 我认为以false和null这个处理方式是个设计的败笔。忽略的话,很多人catch住一样忽略,你是防不住的。
3 人生要有追求啊,为什么要多看日志。
20 楼 gdpglc 2010-11-28  
linliangyi2007 写道
我觉得这个问题的关键是,系统在哪个层面上拦截/处理异常?
从设计上说,层层往上抛异常,层层记录,却不处理,这样的设计有缺陷的。

底层的异常应该对上层屏蔽,外部API调用可能得到一个false或者null的结果,但不是异常本身。


1.请问底层的异常上层屏蔽的目的是什么?

2.以false和null表达异常,我觉得不合适。调用者很可能会忽略对异常的处理。

3.打印日志,我建议,catch异常的就要进行记录。在多人合作的情况下,这样的规则最容易统一,必免出现异常出现而不记录的情况。多看点日志对个程序员来说,也不算啥。

19 楼 zhang_xzhi_xjtu 2010-11-28  
抛出异常的爱 写道
zhang_xzhi_xjtu 写道
en 现在超时很多

用日志分析工具吧....
sh写一个

系统有专门的监控系统,我也有写awk脚本。
但是问题是这样打log,我觉得不合理。
18 楼 抛出异常的爱 2010-11-17  
zhang_xzhi_xjtu 写道
en 现在超时很多

用日志分析工具吧....
sh写一个
17 楼 agapple 2010-11-17  
这个还是异常的设计问题

需要规范好业务异常和系统异常,各司其职,在合适的地方捕获处理
16 楼 zhang_xzhi_xjtu 2010-11-16  
en 现在超时很多
15 楼 抛出异常的爱 2010-11-16  
zhang_xzhi_xjtu 写道
打在哪里呢,我是接受打多次的,但是不接受一个log文件里面打多次。
如果打两次还是在同一个文件里面,那么也是不好的。

你家代码中异常很多么?
14 楼 zhang_xzhi_xjtu 2010-11-16  
打在哪里呢,我是接受打多次的,但是不接受一个log文件里面打多次。
如果打两次还是在同一个文件里面,那么也是不好的。
13 楼 抛出异常的爱 2010-11-16  
zhang_xzhi_xjtu 写道
抛出异常的爱 写道
runtimeexception
只打二次.


when and where?

错误发生的地方 , 需要回滚的地方
其它的地方不用捕获也不用打日志.
12 楼 zhang_xzhi_xjtu 2010-11-15  
抛出异常的爱 写道
runtimeexception
只打二次.


when and where?
11 楼 zhang_xzhi_xjtu 2010-11-15  
buyajun 写道
楼主 你真要是 “C把异常打到c.error.log中,抛出去,B把异常打到b.error.log中,抛出去,A把异常打到a.error.log中”

调试程序的时候 会累死
得看 N个 log文件


no,对于c系统来说,只看c.error.log就好了。所有的堆栈信息都有的啊。
10 楼 zhang_xzhi_xjtu 2010-11-15  
snovian 写道
如果声明抛出异常,就不应该记录也不应该捕获


框架本身也要记录异常,来观测框架的使用情况。
9 楼 zhang_xzhi_xjtu 2010-11-15  
linliangyi2007 写道
我觉得这个问题的关键是,系统在哪个层面上拦截/处理异常?
从设计上说,层层往上抛异常,层层记录,却不处理,这样的设计有缺陷的。

底层的异常应该对上层屏蔽,外部API调用可能得到一个false或者null的结果,但不是异常本身。


这个情况太理想,而且也是可以商量的,异常吞没返回一个null或者false,未必是一个好的实践。
8 楼 zhang_xzhi_xjtu 2010-11-15  
xixix2004 写道
这个不是什么技术问题吧。

1,异常从C抛到B,再从B抛到A,A的异常堆栈信息能保存相应的信息。
2,C,B不能处理异常为什么要捕获。

很简单的方法,B,C直接抛出,只在A捕获,打印异常信息即可。

捕获异常的奥义:谁有能力处理谁捕获。

你懂的。


有些第3方库,就是捕获,打log,再抛出。这个我控制不了的。
7 楼 buyajun 2010-11-15  
楼主 你真要是 “C把异常打到c.error.log中,抛出去,B把异常打到b.error.log中,抛出去,A把异常打到a.error.log中”

调试程序的时候 会累死
得看 N个 log文件
6 楼 wwj85523 2010-11-15  
我觉得应该处理这个错误,让它下次不出错,
而不是处理这个log,让它出现而不显示,真正狼来了就倒霉了,呵呵

相关推荐

    c++记录日志到文件里面

    可以提供一个静态方法来完成这个任务,确保文件只在程序开始时打开一次。 4. **记录日志**:为`Logger`类添加一个模板方法,如`log()`,它接受日志级别和日志消息作为参数。在这个方法中,先格式化日志信息(包括...

    文件的上传与下载及服务器文件管理全套代码

    - 为了提高性能,大文件上传可能需要分块处理,使用流式处理避免一次性加载整个文件到内存。 - 服务器文件管理需要考虑权限系统,如基于角色的访问控制(RBAC),确保只有授权的用户能执行特定操作。 6. **数据库...

    如何编写批处理文件批处理文件批处理文件

    在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们...

    Xluo大型文件上传下载系统源码 v1.0

    系统目录里面附带程序日志记录文件,程序的每一次异常都会存储在XluoUpAndDown.log文件里面。 您可以随时查询系统运行情况。 Upload目录是文件存放目录,因程序写死,请勿改动目录,谢谢。 App_Code目录里面有...

    python面试题及答案.txt

    全局解释器锁(GIL)是CPython解释器(Python的官方实现)的一个内部机制,它确保任何时候只有一个线程在执行Python字节码。这意味着即使在一个多核处理器上,Python的线程也不能同时运行,从而限制了多线程程序的...

    reactor_friendft3_冒险岛_drivingh87_

    在这个压缩包中,只有一份名为"reactor"的文件,这很可能是一个包含了所有reactor相关脚本的集合,可能包括了各种reactor的定义、行为逻辑、触发条件和响应机制。开发者可能需要通过阅读和理解这些脚本来进行游戏的...

    别在Java代码里乱打日志了,这才是正确的打日志姿势

    在Java编程中,日志记录是一项至关重要的任务,它能够帮助开发者在系统出现问题时快速定位错误,跟踪系统运行状态,并优化程序性能。然而,随意地在代码中添加日志语句不仅会影响代码的整洁性,还可能导致不必要的...

    IIS6.0 IIS,互联网信息服务

    比如你本机只有一个IP地址为192.168.0.1,你已经建立(或设置)好了两个Web站点,一个是“默认Web站点”,一个是“我的第二个Web站点”,现在你想输入“www.enanshan. com”可直接访问前者,输入“www.popunet. com...

    X-Scan

    “顺序执行针对服务的破坏性脚本” - 如果一个脚本正在尝试D.O.S某个服务,另一个脚本同时在获取该服务信息,或同时有其他脚本尝试溢出该服务,将导致扫描结果不正确。但如果脚本间不需要互相等待,将会节省...

    强大的扫描工具x-scan

    Q:为什么在一次扫描中我选择了“SYN”方式进行端口扫描,但X-Scan实际采用的是“TCP”方式, 而且也没有被动识别出目标操作系统? A:端口扫描中的“SYN”方式在NT4或XP+SP2系统下无法使用,在windows 2000等...

    x-SCAN -V3.3-CN.

    Q:为什么在一次扫描中我选择了“SYN”方式进行端口扫描,但X-Scan实际采用的是“TCP”方式,而且也没有被动识别出目标操作系统? A:端口扫描中的“SYN”方式在NT4或XP+SP2系统下无法使用,在windows 2000等系统...

    X-Scan v3.1

    Q:扫描一个子网,进程里同时出现10个checkhost.exe的进程是什么原因? A:检测每个主机都会单独起一个Checkhost.exe进程,检测完毕会自动退出。并发主机数量可以通过图形界面的设置窗口设定,命令行程序通过“-t...

Global site tag (gtag.js) - Google Analytics