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

如何'优雅'使用错误/异常

  •  
  •   king888 · 2019-03-22 14:31:41 +08:00 · 2216 次点击
    这是一个创建于 2076 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码在运行时避免不了出现一些偏差的情况:值类型错误;使用流程错误;传参出错...。

    通常做法就需要在‘业务逻辑代码’中引入额外‘错误 /异常’处理代码处理类似上诉情况的情况:根据业务逻辑重新决定执行流程或者提示信息。

    慢慢会出现业务代码嵌套着一堆‘错误 /异常’处理代码,造成以后修改上阅读理解上的困扰。

    第 1 条附言  ·  2019-03-23 10:26:07 +08:00

    其实楼主想问的是编程思想,编程语言随意。 不知道大家是否遇到下面情况,还是随便能快速干完工作就ok了,我们先抛开其它因素,就单单编程思想层面上讨论。

    对于#1的描述,继承Exception类,然后抛出异常(try-catch),项目迭代多后,可能会出现这样情况:

    class X1Exception extend Exception;
    class X2Exception extend Exception;
    class X3Exception extend Exception;
    class X4Exception extend Exception;
    // 根据业务情况,可能有多种Exception类型...
    
    // 情况一
    
    ...
    
    业务代码...
    
    try {
        业务代码...
    } catch (X2Exception x2) {
        处理x2异常代码..
    } catch (X4Exception x4) {
        处理x4异常代码..
    }
    
    业务代码..
    
    try {
        业务代码..
    } catch (X1Exception x1) {
        异常处理代码..
    } catch (X3Exception x3) {
        异常处理代码..
    }
    
    业务代码...
    
    
    // 情况二
    
    业务代码...
    
    // 异常处理代码...
    if (xx) {
       if (xxx) {
             thrwo new X1Exception;
       } else {
             thrwo new X2Exception; 
       }
    }
    
    业务代码...
    
    // 异常处理代码...
    if (xx) {
       thrwo new X3Exception;
    }
    
    业务代码...
    业务代码...
    
    // 异常处理代码...
    if (xx) {
       thrwo new X4Exception;
    }
    
    业务代码...
    
    

    就上面举例2种情况,对于业务逻辑的变更,会需要:维护Exception类,维护与业务逻辑嵌套一起的异常抛出代码,最后还要维护处理异常的代码。当这些一多了之后,笑容应该会逐渐僵硬吧。实际情况可能更复杂。

    对‘优雅’的定义是:使用简单,容易维护。

    6 条回复    2019-03-22 22:33:41 +08:00
    Jrue0011
        1
    Jrue0011  
       2019-03-22 14:48:36 +08:00
    别人库的异常也只能 try-catch 吧,自己的业务异常可以像 Spring 那样继承 RuntimeException,controller 抛出后统一处理,不过没有编译器警告这点需要注意一下
    pmispig
        2
    pmispig  
       2019-03-22 15:04:02 +08:00
    学习 GO 语言你就懂了,if err != nil 逼死你
    atonku
        3
    atonku  
       2019-03-22 15:30:55 +08:00
    logger.error("这是一个优雅的错误");
    allgy
        4
    allgy  
       2019-03-22 16:29:50 +08:00
    你这个问题应该这么问: 在某某语言中 如何优雅的使用错误 /异常
    littleMaple
        5
    littleMaple  
       2019-03-22 16:56:17 +08:00
    封装和抽象做得够好,就能够让你只用写 high level 的代码,所有 dirty 的异常处理都在底层去了
    yccalculus
        6
    yccalculus  
       2019-03-22 22:33:41 +08:00
    monad
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5791 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:38 · PVG 09:38 · LAX 17:38 · JFK 20:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.