Python 在调用check函数的函数中,错误消息应该在哪里生成/打印/发送?
我已经开始质疑我处理错误的方式是正确的还是像蟒蛇一样的。下面的代码场景本质上很简单,而实际使用更符合discord.py和PRAW(reddit)。布尔值表示成功,返回的消息是总结触发的异常的消息 以下哪种场景(具有非常简化的函数)是正确的python方法,或者根本没有?还是我还没想到/学过的Python 在调用check函数的函数中,错误消息应该在哪里生成/打印/发送?,python,python-3.x,function,error-handling,Python,Python 3.x,Function,Error Handling,我已经开始质疑我处理错误的方式是正确的还是像蟒蛇一样的。下面的代码场景本质上很简单,而实际使用更符合discord.py和PRAW(reddit)。布尔值表示成功,返回的消息是总结触发的异常的消息 以下哪种场景(具有非常简化的函数)是正确的python方法,或者根本没有?还是我还没想到/学过的 场景1:主函数从check函数返回false,但check函数打印消息 def main_函数(): #调用check函数 成功=检查功能(1,2) 如果不成功: 返回 def check_功能(音调、
场景1:主函数从check函数返回false,但check函数打印消息
def main_函数():
#调用check函数
成功=检查功能(1,2)
如果不成功:
返回
def check_功能(音调、inttwo):
如果吟诵!=第二点:
打印(“不一样”)
返回错误
返回真值
场景2:主函数根据check函数返回的布尔值打印错误消息
def main_函数():
#调用check函数
成功=检查功能(1,2)
如果不成功:
打印(“失败,不一样”)
返回
def check_功能(音调、inttwo):
如果吟诵!=第二点:
返回错误
返回真值
场景3:check函数返回一个布尔值和一条生成的错误消息,如果为false,主函数将打印该消息
def main_函数():
#调用check函数
成功,错误=检查函数(1,2)
如果不成功:
打印(错误)
返回
def check_功能(音调、inttwo):
如果吟诵!=第二点:
返回False,“不一样”
返回真值
显然,我正在做的编码使我想到这一点稍微复杂一些,但我相信这些示例已经被继承了。在大多数情况下,我会避免选择1。通过让它做报告,你限制了它在未来的使用。如果您希望以后在tkinter应用程序中使用此功能,该怎么办?
打印是否仍然合适?如果函数的任务是执行检查,那么它应该只执行检查。调用者可以找出他们想要如何使用返回的布尔值
选项2和3都是可行的,但您将根据具体情况使用哪个选项
- 如果一个函数只有一种失效方式,或者所有不同的失效都应该以相同的方式处理,那么简单的
False
就可以了,因为False
意味着单一的失效原因
- 如果一个函数有多种不同的失败方式,那么返回一些允许多种原因的失败指示器会更好。在某些情况下,
Union[bool,str]
类型的返回可能是合适的;虽然我不认为字符串是好的错误类型,因为它们可能被输入错误。我认为一个Union[bool,ErrorEnum]
的元组会更好;其中ErrorEnum
是一些enum.enum
可以接受一组受限的可能值
选项3与Haskell和类型的相似性较弱。如果您对不同的错误处理方式感兴趣,那么了解“池塘的另一边”如何处理错误可能会有所启发。下面是一个类似于您从或链接获得的示例:
>>> import Data.Char ( digitToInt, isDigit )
>>> :{
let parseEither :: Char -> Either String Int
parseEither c
| isDigit c = Right (digitToInt c)
| otherwise = Left "parse error"
>>> :}
parseother
返回已解析的整数或表示错误的字符串。如果听起来您习惯于输出布尔值以判断事情是否顺利
如果发生错误,则输出False
,或True
此外,如果出现错误,则使用print()
语句显示错误
使用类似于您的方法的伪代码示例如下所示:
#定义烘焙蛋糕的功能:
def制作煎饼():
"""
输出有序对(`ec`,cake)
`ec`是一个错误代码
如果'ec'为零,则'cake'为成品蛋糕
错误代码:
0-一切顺利
1-没有可用的搅拌碗
我们需要买些鸡蛋
我们需要买些面粉
"""
#如果有可用的搅拌碗:
#拿出一个搅拌碗
如果厨房有(1个“碗”):
我的碗=厨房.pop(1,“碗”)
其他:#没有可用的搅拌碗
打印(“我们需要一个搅拌碗来做蛋糕”)
返回1#没有可用的搅拌碗
#如果有鸡蛋供应:
#把鸡蛋放进碗里
如果厨房有(6个“鸡蛋”):
my_eggs=kitchen.pop(6,“蛋”)
我的碗。插入(我的蛋)
否则:#鸡蛋用完了
打印(“鸡蛋用完了。需要更多鸡蛋”)
返回2
#如果有小麦粉可用:
#把2杯面粉放进碗里
如果len(kitchen.peek(“面粉”)>0:
f=厨房。pop(“面粉”,2,“杯子”)
我的碗。插入(f)
其他:
打印(“没有足够的面粉做蛋糕”)
返回3,无
#在碗里搅拌鸡蛋和面粉
#搅拌3次
对于范围(0,3)内的uu:
搅拌
#把蛋糕糊从碗里倒进平底锅里
my_batter=bowl.pop()
平移推(我的击球手)
#做蛋糕
炉子。推(锅)
炉子,打开
炉子,关掉
蛋糕=pan.pop()
返回err_代码,即
上面的代码类似于几十年前编写的代码
通常
0
被解释为False
1
,2
,3
,等
。。。都是真的
0
表示未发生错误
,这可能会让人困惑
但是,
事情只有一个正确的方向。
有很多方法会让事情出错
编写的程序,用python、java、C++、c++编写,