Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字符串转换为(可能的)整数。错误处理:使用正则表达式筛选或尝试…捕获?_Python_C++_Regex_Error Handling_Try Catch - Fatal编程技术网

Python 字符串转换为(可能的)整数。错误处理:使用正则表达式筛选或尝试…捕获?

Python 字符串转换为(可能的)整数。错误处理:使用正则表达式筛选或尝试…捕获?,python,c++,regex,error-handling,try-catch,Python,C++,Regex,Error Handling,Try Catch,坐在这个问题面前,我不确定我应该选择哪条道路 我得到表示ID的字符串输入。 大多数情况下,在表/目录中查找实际ID意味着使用完整的键名。 但也可以直接输入整数ID。但这些将以字符串的形式出现 我不确定这更像是一个风格问题,还是有人倾向于一种选择 备选案文1: 使用regexp,检查整数, 如果为true,则转换 备选案文2: try ID = string.tointeger() catch ID = table[string] 我倾向于尝试…捕捉选项,因为它看起来更干净。

坐在这个问题面前,我不确定我应该选择哪条道路

我得到表示ID的字符串输入。 大多数情况下,在表/目录中查找实际ID意味着使用完整的键名。 但也可以直接输入整数ID。但这些将以字符串的形式出现


我不确定这更像是一个风格问题,还是有人倾向于一种选择

备选案文1: 使用regexp,检查整数, 如果为true,则转换

备选案文2:

try 
    ID = string.tointeger()
catch
    ID = table[string]
我倾向于尝试…捕捉选项,因为它看起来更干净。但我不确定通过regex避免错误处理是否是一种更干净的方法,并且应该是首选方法

对尝试…捕获没有更深入的了解;如果它真的很平滑,那么“如果你喜欢就用它”或者“如果你不能避免打嗝”

“为了表现而牺牲正确性的人都不值得[!?]

TL;博士:

try…catch
可以非常快。看起来比试图传递错误的代码更干净。另一方面,当有大的代码块,并且在幕后发生了你可能不想要的事情时,其他人可能更难理解。 这当然取决于语言

regexp可能非常慢,而且在它可以节省您的时间之前,它是一个便宜的过滤器

--

所以现在我自己试着回答这个问题:

我希望得到一个一般性的答案,但最终它当然取决于语言。 在做研究时,我经常发现参数很昂贵,创建异常对象,收集调用堆栈。。。当然有道理。但通常并没有任何解释,这更像是一种耻辱或迷信:尝试……捕捉是不好的


从我的测试(C++):try…catch方法是最快的。执行速度仅下降3%。两个简单的“字符串是否以数字开头?”
“^-?\d+”
regexp for integer和float是一个50%的降幅,在这50%^x变得明显后,我做了一些子字符串分析


最后,我被比亚恩·斯特罗斯特普(creator或C++)自己的常见问题解答难住了:

使用异常对我有什么好处?基本答案是:使用 错误处理的异常使您的代码更简单、更干净、更安全 不太可能错过错误。但是“老好人”有什么不对 如果声明“?基本答案是:使用这些,您的错误处理 你的普通代码是紧密交织在一起的。这样,您的代码就可以 杂乱无章,很难确保你已经处理了所有的问题 错误(想想“意大利面代码”或“老鼠窝测试”)。 [……]

对使用例外的常见反对意见: 但例外情况是昂贵的!:不是真的。现代C++实现 将使用异常的开销减少到百分之几(比如说,3%),并且 这与无错误处理相比。编写返回错误的代码 代码和测试也不是免费的。根据经验,例外情况 当您不抛出异常时,处理非常便宜。信息技术 在某些实现上不需要任何成本。所有费用都是在 您抛出一个异常:“普通代码”比代码快 使用错误返回代码和测试。只有当你有足够的钱时,你才会付出代价 一个错误

最后,我决定在regexp之前使用简单的手动过滤器数组[-,0-9]中的第一个字符。这可能比try…catch慢10%,但在80%的时间内不会抛出错误。仍然具有良好的性能和良好的代码:)


从Python词汇表中:

EAFP 请求原谅比允许更容易。这是一条常见的Python 编码样式假定存在有效的键或属性,并且 如果假设被证明是错误的,则捕获异常。这件衣服又干净又快 风格的特点是除了 声明。这项技术与许多人常见的LBYL风格形成对比 其他语言,如C

LBYL 三思而后行。这种编码风格在调用或查找之前显式地测试前置条件。这种风格形成鲜明对比 使用EAFP方法,其特点是存在许多if 声明。 在多线程环境中,LBYL方法可能会在“注视”和“跳跃”之间引入竞争条件。 例如,代码if key in mapping:return mapping[key]可能会失败 如果另一个线程在测试之后但之前从映射中删除密钥 查找。这个问题可以通过锁或使用EAFP来解决 接近