如何处理构造函数的失败?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理构造函数的失败?相关的知识,希望对你有一定的参考价值。

1、构造函数想通知外部自己构造失败,只有抛异常这一个途径(没有返回值);
  2、 如果不抛异常,那么构造函数执行完毕,从语言层面上编译器认为该对象是正确构造了的,其实构造没有按预想的进行,所以需要用状态变量、构造函数引用参数就可以让外界可以知道构造失败了。
  3.、如果抛异常标识构造失败,那么,所有已经构造好的基类对象和数据成员会按照构造逆序逐个进行析构(基础数据类型除外,因为它们析构就是什么都不做)。这里有一点要注意,如果发生了动态内存分配,那需要在抛异常前手动释放内存,否则会有内存泄漏。
  构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
参考技术A 由于构造函数没有返回值,因此通过返回错误码来判断构造函数是否成功是不可能的,所以最好办法应该是抛出一个异常。另外在抛出异常时需要注意的是,由于构造函数抛出异常的话,对象的析构函数就不会执行了,故在抛出异常的同时还需要对已经执行的动作(如分配了内存、打开了文件、锁定了信号量等等)进行清理,将这些资源释放掉。如果不通过抛出异常来处理构造函数的失败,还有一种不是很好的办法,就是通过标志位来进行记录内部状态,然后通过判断内部状态来识别构造函数是否正常。但这种方式一般不推荐使用,只有在有充分理由不能使用抛出异常时使用。本回答被提问者采纳

如何处理失败的可选绑定

【中文标题】如何处理失败的可选绑定【英文标题】:How to handle failed Optional Binding 【发布时间】:2020-12-23 16:50:43 【问题描述】:

我正在尝试从一个返回可选的字符串创建一个新的 URL 数据类型。当我尝试可选绑定时,缩进的代码永远不会被执行。

如何捕获错误或可选绑定失败的原因?

let newString = "http://somehost:1337/parse/classes/CompEntry?where=\"CompID\":\"__type\":\"Pointer\",\"className\":\"Competition\",\"objectId\":\"CXy40U65Z9\""
if let url = URL(string: newString) 
    print("here") // NEVER GETS EXECUTED

是不是因为字符串中转义了"字符?

【问题讨论】:

您的问题是关于“”还是关于“如何正确转义 URL 字符串”? 这不是创建 URL 的方法。使用 URL 组件。永远不要在真实代码中调用 URL(string:)! 感谢您的指点,@matt。尝试使用 queryItemToken 方法,但字符串中的转义字符仍然存在相同的问题。我需要为 Parse Platform 提供这种 JSON 格式 【参考方案1】:

只需将 else 添加到 IF 控制流

let newString = "http://somehost:1337/parse/classes/CompEntry?where=\"CompID\":\"__type\":\"Pointer\",\"className\":\"Competition\",\"objectId\":\"CXy40U65Z9\""
    if let url = URL(string: newString) 
        print("here") // NEVER GETS EXECUTED
     else 
        print("here") // EXECUTED when optional binding fails
    

更新: 作者预计会出错

在无法解析给定字符串的情况下,URL 初始化程序不会引发错误

如果字符串不代表一个有效的,这个初始化器返回 nil 网址。例如,一个空字符串或一个包含以下字符的字符串 在 URL 中是非法的会产生 nil。 source

【讨论】:

是的,我添加了类似的代码来验证if let 语句是否失败。我只是不知道为什么或如何排除故障。似乎没有error 对象... 谢谢@Alexander-ReinstateMonica - 确实回答了。从 matt 回复原帖的评论来看,我也在调查 URLComponents【参考方案2】:

您可以从下面的字符串创建 url:

let newString = "http://somehost:1337/parse/classes/CompEntry"
if let url = URL(string: newString) 
     print("here")

然后创建一个 params 字典,如:

 params = ["CompID": ["__type": "Pointer", "className": "Competition", "objectId": "CXy40U65Z9"]]

然后在 URLRequest 的 httpBody 中发送这些参数。

【讨论】:

以上是关于如何处理构造函数的失败?的主要内容,如果未能解决你的问题,请参考以下文章

当我为此目的创建构造函数时,如何处理 Doctrine::find 未初始化未映射的实体属性?

复制控制函数中如何处理 C++ 数组成员?

如何处理 std::vector 的错误?

析构函数和构造函数

数组②Array 构造函数

返回类构造函数的函数的类型声明