美文网首页C++ 2a
MDL中不使用异常的编程方法

MDL中不使用异常的编程方法

作者: 左图右码 | 来源:发表于2020-10-27 12:27 被阅读0次

C++中的异常使用起来很繁琐,编码上也很不优雅,甚至有大神说应该禁止在代码中使用异常。
使用boost::optional<>传递无效值,可以不用在无效的时候抛出异常,直接返回无效值就可以,接收的时候只需要判断是否有效,就能发现是否存在异常。
在mdl中也存在这样的机制,在EC中,ECValue就能判断是否包含有效的值,还有在头文件<GeomApi.h>中定义了一个模版struct ValidatedValue也可以包装特定的值,并能保存是否有效的状态,内容如下:

template<typename T>
struct ValidatedValue
    {
    private:
        T m_value;
        bool m_isValid;
    public:
        //! Default value, marked not valid.
        ValidatedValue() : m_value(), m_isValid(false){}
        //! Specified value, marked valid.
        ValidatedValue(T const &value) : m_value(value), m_isValid(true){}
        //! Specified value, with validity indicated by caller
        ValidatedValue(T const &value, bool isValid) : m_value(value), m_isValid(isValid){}
        //! explicty query for the "the value", without regard for the validity flag.
        T const &Value() const { return m_value; }
        T &Value() { return m_value; }
        //! return the validity flag.
        bool IsValid() const { return m_isValid; }
        //! return the validity flag, copy value to parameter.
        bool IsValid(T &value) const { value = m_value; return m_isValid; }
        //! update the validit member
        void SetIsValid (bool value){m_isValid = value;}
        //! Implicity type conversion operator Returns "the value", without regard for the validity flag.
        operator T (){ return m_value; }
    };

MDL对常用的结构进行了定义:

typedef ValidatedValue <struct DVec3d> ValidatedDVec3d;
typedef ValidatedValue <struct DVec2d> ValidatedDVec2d;
typedef ValidatedValue <struct RotMatrix> ValidatedRotMatrix;
......

使用中,调用返回的值的IsValid()的函数进行有效性判断:

CurveLocationDetail location{};
....
if (location.PointAndUnitTangent().IsValid())
{
    //do something...
}

这和boost::optional是相同的,稍有不同的是boost::optional重载了bool操作符,而不用调用特殊函数。

相关文章

  • MDL中不使用异常的编程方法

    C++中的异常使用起来很繁琐,编码上也很不优雅,甚至有大神说应该禁止在代码中使用异常。使用boost::optio...

  • Microstation中的工作单位

    在编程时,经常遇到需要做单位换算,因为在Addin和MDL编程中,所给的值的单位为UOR(Unit Of Reso...

  • Android NDK(三)- JNI 异常

    常用方法 使用例 1 - C++ 中抛出异常 使用例 2 - C++ 捕获 Java 中的异常

  • MySQL锁<一>

    MDL锁 对表的增删改查,都需要MDL锁,无所不在 MDL读锁之间不互斥,但MDL读写锁互斥 #举个栗子 假设t是...

  • 你所需要的java异常的处理和设计及深入理解,看这篇就差不多了

    一. 异常的定义 在《java编程思想》中这样定义 异常:阻止当前方法或作用域继续执行的问题。虽然java中有异常...

  • 第十章异常

    目录 仅在发生异常的条件下使用异常 对可恢复条件使用已检查异常,对编程错误使用运行时异常 避免不必要地使用检查异常...

  • 04.并发修改异常

    并发修改异常 当使用迭代器遍历集合的时候,使用了集合中的 增加/删除 方法,导致并发修改异常产生 并发修改异常解决...

  • 如何优雅的处理异常

    1.异常的定义 在《java编程思想》中这样定义异常:阻止当前方法或作用域继续执行的问题。 2.异常的体系 在Ja...

  • 6.Hystrix-多级降级方案

    1.Fallback中修改error方法,不再使用静默方法,再次抛出异常 RuntimeException ...

  • python 自定义异常/raise关键字抛出异常

    在编程过程中合理的使用异常可以使得程序正常的执行。有直接抛出异常的形式,也能通过捕获异常加入异常时的业务逻辑处理。...

网友评论

    本文标题:MDL中不使用异常的编程方法

    本文链接:https://www.haomeiwen.com/subject/detxvktx.html