我如何在python中生成自定义错误消息

时间:2013-12-30 17:24:01

标签: python python-3.x

在我正在创建的python程序中,我希望它只采用整数,如果它得到一个字符串,则说“系统中存在错误”。用户不会理解,而不是扼杀无知的信息

7 个答案:

答案 0 :(得分:9)

使用try-except块捕获错误并使用raise语句说出您选择的错误消息:

try:
    a = int(input())
except:
    raise Exception('There has been an error in the system')

答案 1 :(得分:3)

您需要使用try except块来捕获错误 - 请参阅documentation。然后您可以print发送一条消息,并在必要时退出该程序:

try:
    value = int(input("Enter an integer: "))
except ValueError:
    print("There has been an error in the system.")
    input()    # To let the user see the error message
    # if you want to then exit the program
    import sys
    sys.exit(1)

答案 2 :(得分:2)

使用tryexceptraise

由于ValueError继承自Exception类,因此在创建ValueError对象时,第一个参数是打印的消息:

try:
    int("string") #the code that raises the error
except ValueError:
    raise ValueError("Your custom message here.")

此打印:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: invalid literal for int() with base 10: 'string'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError: Your custom message here.

如果您不想打印以前的错误链,请在from None语句中放入raise

try:
    int("string") #the code that raises the error
except ValueError:
    raise ValueError("Your custom message here.") from None

此打印:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError: Your custom message here.

我建议您离开此链,因为它会提供更多信息,例如输入的错误信息。如果要在自定义消息中包括原始错误的信息,请使用错误的属性:

from traceback import format_tb

try:
    int("string") #the code that raises the error
except ValueError as err:
    raise ValueError("Custom message with traceback and original message\n" + format_tb(err.__traceback__)[0] + err.args[0] + "\nEnd of error message.") from None

此打印

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError: Custom message with traceback and message
  File "<stdin>", line 2, in <module>
invalid literal for int() with base 10: 'string'
End of error message.

尽管这允许自定义错误的打印内容,但是代码有点不合常规。

使用assert

因为您说过要阻止所有所有字符串的问题,所以可以使用assertisinstance()

obj = "a string" #the input you want to raise the error on
assert not isinstance(obj, str), "Your custom message here."

此打印:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Your custom message here.

尽管使用assert看起来很干净,但该错误不会携带太多信息,因为它是通用的AssertionError。抬起ValueError可以一目了然地了解导致错误的原因的更多信息。

答案 3 :(得分:0)

如果您不想使用$functions = array( 'function1' => function($echo) { echo $echo; } ); $functions['function1']("hello world"); // Works //---------- class A { public static $functions = []; } A::$functions['function1'] = function($echo) { echo $echo; }; A::$functions['function1']("hello world"); 块添加其他缩进级别,则可以通过在代码的开头添加以下内容来更改所有错误的处理:

try-except

如果出现错误,则仅打印出您指定的错误消息。此外,此可防止显示堆栈跟踪

答案 4 :(得分:0)

如果要出错,请使用raise。这是一个示例:

raise SyntaxError('MUHAHA THIS IS A ERROR')

这是最简单的方法,我不知道tryexcept的作用

答案 5 :(得分:0)

在大多数情况下,使用raise Exception('There has been an error in the system')可能很有用,但您可能还需要为特定系统创建有意义的错误。

例如


class ExpiredTaxIdException(Exception):
    def __init__(self):
        Exception.__init__(self, 'Tax ID expired')

然后您可以在代码上调用它,例如:


from your_execeptions_file import ExpiredTaxIdException

class ClientsController:
    def is_profile_valid(client):
        if client.tax_id.is_valid == False:
            raise ExpiredTaxIdException()
        return True

# eg. you call it on your API on another place of your code that can't accept invalid tax_id

try:
    ClientsController().verify_client(client)
except ExpiredTaxIdException as e:
    return {'error': str(e)}

>>> { "error": "Tax ID expired" }

答案 6 :(得分:-5)

导入 ctypes ctypes.windll.user32.MessageBoxW(无,你是“CUSTOM MESSAGE”,你是“TITLE BAR”,0)