pythonexceptionvscode-debuggertraceback

Except Hook not working correctly with Vscode debugger


I'm trying to make a library for python and I want to add custom exceptions, but every time I raise an exception, the exception shows my raise as the problem.

For example:

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

I manage to solve this problem using sys.excepthook and no VSCode debugger (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

But when i use the VSCode debugging tool (Start Debugging) it say again that the problem come from my raise.


Solution

  • It seems the issue is because you are not handling your custom exception correctly. You have not provided your code to raise the error, but here's what a custom exception needs:

    Here's an example of a custom exception (here's a guide/example on custom exceptions).

    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")
    

    As you can see, the error raising happens inside of a try except block. This is because when an error is raised, if it is not inside of a try block it will return your raise statement as an error. If you don't put it into a try block, it will not be handled and will cause your program to stop.

    Example error raised when not using try block:

    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!
    

    However, if you just just put it in a try block but don't handle it, then it'll just ignore the error because that's how the try except block's behavior works. Because of this, you need to handle errors.myerror as an exception in the try block.