V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
king888
V2EX  ›  程序员

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

  •  
  •   king888 · Mar 22, 2019 · 2853 views
    This topic created in 2595 days ago, the information mentioned may be changed or developed.

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

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

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

    Supplement 1  ·  Mar 23, 2019

    其实楼主想问的是编程思想,编程语言随意。 不知道大家是否遇到下面情况,还是随便能快速干完工作就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 replies    2019-03-22 22:33:41 +08:00
    Jrue0011
        1
    Jrue0011  
       Mar 22, 2019
    别人库的异常也只能 try-catch 吧,自己的业务异常可以像 Spring 那样继承 RuntimeException,controller 抛出后统一处理,不过没有编译器警告这点需要注意一下
    pmispig
        2
    pmispig  
       Mar 22, 2019
    学习 GO 语言你就懂了,if err != nil 逼死你
    atonku
        3
    atonku  
       Mar 22, 2019
    logger.error("这是一个优雅的错误");
    allgy
        4
    allgy  
       Mar 22, 2019
    你这个问题应该这么问: 在某某语言中 如何优雅的使用错误 /异常
    littleMaple
        5
    littleMaple  
       Mar 22, 2019
    封装和抽象做得够好,就能够让你只用写 high level 的代码,所有 dirty 的异常处理都在底层去了
    yccalculus
        6
    yccalculus  
       Mar 22, 2019
    monad
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3267 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 12:04 · PVG 20:04 · LAX 05:04 · JFK 08:04
    ♥ Do have faith in what you're doing.