Python 在调用check函数的函数中,错误消息应该在哪里生成/打印/发送?

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_功能(音调、

我已经开始质疑我处理错误的方式是正确的还是像蟒蛇一样的。下面的代码场景本质上很简单,而实际使用更符合discord.py和PRAW(reddit)。布尔值表示成功,返回的消息是总结触发的异常的消息

以下哪种场景(具有非常简化的函数)是正确的python方法,或者根本没有?还是我还没想到/学过的


场景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++编写,