返回值 还是 异常?

返回值 还是 异常?

1 异常

  

1.1 好处

  1. 提高代码可读性

    根据区块来区分开正常流程和异常处理

  2. 可迅速追溯到错误源头

  3. 类库定义的异常基类本身能提供很多的信息,如InnerException,StackTrace等

1.2 坏处

  1. 阅读代码时,人眼无法轻易辨认出隐藏的异常

    DoSomething1();
    DoSomething2();

    假设DoSomething1中会抛出异常,通过代码无法一眼看出DoSomething2是否会被执行。
    如果需要确认DoSomething2是否会被执行,你需要了解DoSomething1会抛出哪些异常。
    如果DoSomething1有关于会抛出的异常说明,那还算容易,否则你需要查看整个DoSo-
    mething1调用树结构。

  2. 性能开销大

  3. 语言通用性问题

    假如各模块由不同的语言写成,则只能在模块内使用异常。换言之,各语言的异常处理不具备通用性。

2 返回值

  

2.1 好处

  1. 没有异常的性能问题

  2. 单看代码,很容易辨认程序处理流程

  3. 客户代码编写者看到返回值,会有去处理这些返回值的责任。

2.2 坏处

  1. 特定场景使用限制

    构造函数,线程处理函数等不允许有返回值的情况,以及返回值被用作其他用途的情况

  2. 客户代码不够清晰

    if (returnVal == Success)
    {    
        //DoNormalFlow
    }
    else if (returnVal == ERR1)
    {    
        //Handle ERR
    }

3 我的理解

  • 追求 稳定 高性能 的程序,慎用异常。

  • 团队应为异常处理方式建立规范,以保证项目的统一(Consistency)性。

  • 正确的使用异常,避免异常混入程序控制流。

  • 模块间接口应采用返回值方式。自己模块内的异常确保自己进行了处理。

4 参考文章

Cleaner, more elegant, and harder to recognize—By Raymond Chen
Making Wrong Code Look Wrong—Joel on software
"拥抱"异常,还是,"固守"返回值?—DCCMX 


你可能感兴趣的:(返回值,异常)