zoukankan      html  css  js  c++  java
  • (转)

    前不久看到一文章,说用assert的时候不要把非法情形和错误情形混淆了,错误始终是要处理的.
    然后我review自己最近写的代码,愣是没有弄明白什么是非法什么是错误,难道错误不是非法么,非法不是错误么?
    我本身用assert是相当频繁和随意的,但是经过这么一看,反而觉得原来那些assert的代码都要改成错误处理了...
    花非花,雾非雾.

    经过思考与实践,最终确定了规则.
    非法情形,大部分你觉得有问题的地方,需要约束的地方,都可以认为可能存在非法情形.比如指针有效性,字符串长度,数值范围等等.更抽象的说,非法情形存在于动作开始执行前的状态中.
    相对之,错误就是动作执行之后的结果,错误是针对执行结果的.
    详细而言,当调用一个函数,进入函数体的时候,就进入了一个非法情形出现点,在这里,在执行任何具体的计算和动作之前,面对参数还有其他状态,你嗅到的任何东西都可以说是非法情形.然后函数开始执行,这里面所出现的任何(大多数)失败都是一种错误,需要进行处理.
    需要着重强调的是,函数的执行结果(返回值)绝对是一种错误(如果返回值是那个意思的话),而不是非法状态.(考虑一种计算函数,它的返回结果限制在某个范围内,这是非法状态还是错误呢?我认为还是错误,虽然有些像非法状态,要进行更严格的处理和提示).

    我极度强调在函数执行前确认非法状态,而不是当成错误处理(通常这种处理都是默默的,不透明的,不像assert那样嚣张-_-|||).因为我们写函数(接口)的目的,是希望能被正确的调用,而不是胡乱(导致局部或者整体状态混乱)的使用(为此我们居然要将assert写成错误处理的形式,以容忍各种白痴的调用行为).
    但是有一些情形,在不得以的情况下,比如一个函数,要assert某个指针是有效的,然后才能执行某些动作,但是随后的执行状况是,极度可能在那个指针无效的时候却仍然不可避免的调用该函数,那么你就把assert简单的用if替换掉就是了,没什么难的.但是,第一次写下那个函数的时候,吓你一跳的assert永远是不二的选择,如果你直接就用了if之类的错误处理,后面出什么状况就不是那么显眼了.

    正确的滥用assert吧,至少我是这么做的.
  • 相关阅读:
    virtio前端驱动详解
    virtIO前后端notify机制详解
    virtio后端驱动详解
    centos7手动编译安装Libvirt常见问题
    手动编译安装Libvirt之后利用systemctl管理libvirtd服务
    android学习点滴一:android环境的搭建
    phpcms换域名细节
    apache配置中的小细节
    娱乐一下-加班的不归路
    qt5.3+vs2013乱码
  • 原文地址:https://www.cnblogs.com/lancidie/p/1833970.html
Copyright © 2011-2022 走看看