V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX  ›  编程

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

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

    最近在改一些老的 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   ·   我们的愿景   ·   实用小工具   ·   4993 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:49 · PVG 11:49 · LAX 20:49 · JFK 23:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.