处理异常,有没有比较好的 practice 或者方法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX    编程

处理异常,有没有比较好的 practice 或者方法?

  •  
  •   yazoox 2020-07-03 09:25:00 +08:00 2371 次点击
    这是一个创建于 1993 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在改一些老的 sdk 代码,有的抛出了异常,有的没有。 使用端,有的异常处理了,有的又没有。debug 时候,代码乱跳,一直也找不到合适的地方处理。

    所以,特意来请教一下。

    大家代码时,通常,是如何处理异常的 (即 throw exception )

    在设计 API,class/methods 的时候,什么时候处理掉异常不抛出,什么时候直接抛出去,交给外面去处理。

    有没有比较好的设计规范或者 可以参考的 best practice ?

    谢谢

    4 条回复    2020-07-09 16:57:56 +08:00
    kop1989
        1
    kop1989  
       2020-07-03 09:30:10 +08:00
    我的原则是,本层可以解决的异常,就在本层处理,本层解决不了,或者需要额外信息,代价太大的,抛给上层。
    然后顺道我想讨论个问题。java 抛异常是强制上层必须 Catch 的,但是 C#好像没有这种机制,这样非常容易忘记异常处理逻辑,C#是出于什么设计目的?
    teketernal
        2
    teketernal  
       2020-07-03 10:16:31 +08:00
    平常写 Java 的 rest API,都是继承 RuntimeException 自定义业务异常,然后随便抛。
    然后统一在 Controller 层写切面或者注入 GlobalExceptionHandle 处理异常,封装 ErrorCode 。
    wongy
        3
    wongy  
       2020-07-03 11:25:42 +08:00
    Java 代码我是用 @ControllerAdvice + @ExceptionHandler 处理异常
    wenlele
        4
    wenlele  
       2020-07-09 16:57:56 +08:00
    归根结底,这都是因为没想清楚业务对象的职责。

    以分层的架构看,每一层有自己的职责,每个层有自己的职责,因此也会有自己职责下的私有领域概念,但层与层之间的接口(包括抛上去的异常)应该是共享的概念,下层不能将其私有的概念返回给上层。

    在 OOP 里,具体到某一个类或类的方法,也是如此。它的职责或者说接口定义决定了它应该返回什么,在错误情况应该怎么返回结果(通过异常还是返回对象)。有时候,可以抛异常,也可以返回特殊的结果;我觉得没必要强求坚持每一种,只要内部统一风格,保持一致性就可以了。如果担心其他人不遵守,最后引用一些代码规范的自动化检测,确保风格能统一。

    然而,在一些古老的代码,尤其是以前的人不重视一致性,你说这种情况很正常。一般也没必要重构,只要确保之后的改动遵循目前多数人认同的风格就行,而不是引入另一种全新的而且没经过多数人审核的风格……
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2883 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 14:15 PVG 22:15 LAX 06:15 JFK 09:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86