除了 Hook 无法与 Vscode 调试器一起正常工作

问题描述 投票:0回答:1

我正在尝试为Python创建一个库,我想添加自定义异常,但是每次我

raise
出现异常时,异常都会显示我的
raise
是问题所在。

例如:

Traceback (most recent call last):
  File "c:\Users\james\Desktop\mylibrary\testing.py", line 16, in <module>  
    'the library user doing absolute shit'
  File "c:\Users\james\Desktop\mylibrary\mylibrary\__init__.py", line 100, in function_name
    else: raise errors.myerror('Text about my custom error')  
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    
errors.myerror: Text about my custom error

我设法使用

sys.excepthook
解决了这个问题,并且没有使用 VSCode 调试器 (
Run Without Debugging
):

Traceback (most recent call last):
  File "c:\Users\james\Desktop\mylibrary\testing.py", line 16, in <module>  
    'the library user doing absolute shit'
errors.myerror: Text about my custom error

但是当我使用 VSCode 调试工具(

Start Debugging
)时,它又说问题来自我的
raise

python exception vscode-debugger traceback
1个回答
0
投票

问题似乎是因为您没有正确处理自定义异常。您尚未提供引发错误的代码,但自定义异常需要以下内容:

  • 当然是异常类,你有。
  • 错误引发必须发生在
    try
    语句中。代码本身可以在函数中,但是当代码运行时,它必须发生在
    try
    块内。
  • 必须有一个
    except
    语句来处理错误。这是任何
    try
    块所必需的,如果您没有正确处理错误,那么自定义异常就没有意义。

这是自定义异常的示例(此处是有关自定义异常的指南/示例)。

class errors:
    class cost_error(Exception):
        def __init__(self, message):
            super().__init__(message)
            self.message = message

money, cost_of_item = 5, 100 #variables for example

try:
    if cost_of_item > money:
        raise errors.cost_error("This item is too expensive!")
    else:
        print("Item purchased!")
except errors.cost_error as error:
    print(f"Error: {error}")
    quit() #This built-in function will terminate the program

print("Hey, if the item is too expensive then this won't print")

如您所见,错误引发发生在

try
except
块内部。这是因为当引发错误时,如果它不在
try
块内,它将返回您的 raise 语句作为错误。如果您不将其放入
try
块中,它将不会被处理并导致您的程序停止。

不使用

try
块时引发的错误示例:

Traceback (most recent call last):
  File "/Users/person/test.py", line 20, in <module>
    raise errors.cost_error("This item is too expensive!")
__main__.cost_error: This item is too expensive!

但是,如果您只是将其放入

try
块中但不处理它,那么它将忽略该错误,因为这就是
try
except
块的行为方式。因此,您需要在
errors.myerror
块中将
try
作为异常处理。

© www.soinside.com 2019 - 2024. All rights reserved.