我现在在写得一个小程序,基本逻辑是,输入是一个 generator ,在程序里面对每个元素进行处理,输出一个新的 generator 。
def main(): data_gen = xrange(10) # just an example data1 = func1(data_gen) data2 = func2(data1) ...
def func1(data_gen): for element in data_gen: try: ret = process(element) except Exception, e: logger.error(e.message) # 我的处理 raise # 网上看到其他人的处理 else: yield ret
func2,func3 逻辑大致相同。
通常出现的异常主要有:数据长度不够,本应该有数据却有 None 值,等。不是很频繁。
我的目标是:对于『正常的 element 』返回正确的结果。 出现异常, 记录下异常的原因。(我通常写, func1 expect XX rows, however database returns YY rows.)
我的问题是,什么情况下用 raise 比较好? 你们通常是怎么做的?
![]() | 1 des 2016-01-14 07:43:21 +08:00 如果是致命异常就抛出, |
![]() | 2 janxin 2016-01-14 07:57:03 +08:00 via iPhone 看类型,如果是顶层应用,原则是尽量处理并日志记录。下层基本是抛异常。 |
3 ttycode 2016-01-14 07:59:27 +08:00 via Android 这就看你怎么区分了,一般来说根据严重程度分为错误和异常,错误是业务逻辑的一个部分,就是不会影响其他逻辑处理,这个记录日志就好了。而异常就是这个问题影响到其他的处理了,比如说数据库坏了这种事情就是异常,没它大家都完成不了逻辑处理。说不是绝对,是因为足够多的错误也应该视为异常,有可能是外部人为攻击行为。这种就要将错误升级为异常行为。 |
4 monnand 2016-01-14 08:50:52 +08:00 via Android 不用异常,全部错误显示处理,尽量把各种事件都记录下来。异常乱抛最后调 bug 倒霉的还是自己 |
![]() | 5 sujin190 2016-01-14 09:30:46 +08:00 ![]() 日志写太多反而没用了,太多的日志你能不能找到错误点不说,都不知道哪写出来的,还是分层不同处理比较好,应用层核心点统一处理标准日志,尽可能收集信息,业务错误另外再写,底层尽可能抛出异常不写日志 |
6 billgreen1 OP @sujin190 能详细说说嘛,举个例子?感觉比较认同你的想法,但是有点模糊,要是有个例子来加深理解就好了。 |
7 bobuick 2016-01-14 10:02:22 +08:00 没办法继续了,或者继续下去意义不大且消耗太多, 果断抛异常出去, 特别是用 golang , 否则满天满地的 if err != nil {blabla} |
![]() | 8 hqs123 2016-01-14 10:04:18 +08:00 log 打印慢慢分析. |
![]() | 9 strahe 2016-01-14 10:07:17 +08:00 下层都是抛出,上层根据抛出的异常处理,最后仍出去的是友好的 |
![]() | 10 yuelang85 2016-01-14 10:51:39 +08:00 抛出异常-》最外层捕获异常-》生成 log 内容-》打印 log -》 log 内容发送邮件 大概这么个流程 |
![]() | 11 gamexg 2016-01-14 11:13:02 +08:00 一般都是底层抛异常,顶层处理并记录。 比较简单的方式是把自己写的底层可复用的代码按库的方式写。 比如库一般通过错误、异常向调用方报告错误,而不是输出日志并隐藏错误。 有一些特殊情况,例如 python encode 时,如果单个字符解码错误默认直接抛出异常,不过 python 标准库提供了一个参数,允许忽略单个错误。 |
![]() | 12 Reed 2016-01-14 20:08:44 +08:00 我是直接 logger.exception(e),所有的异常信息都被记录了。 |
13 billgreen1 OP @Reed 你是在 func1 这样的函数里面 logger 还是在 main 函数里面来 try except 然后 log ? |
14 billgreen1 OP |
![]() | 15 yuelang85 2016-01-14 20:27:53 +08:00 @billgreen1 是的,就是这个思路 |
![]() | 16 glasslion 2016-01-17 00:33:23 +08:00 抛异常, sentry 处理 |