How do I raise the same Exception with a custom message in Python?

前端 未结 12 1112
情书的邮戳
情书的邮戳 2020-12-12 09:45

I have this try block in my code:

try:
    do_something_that_might_raise_an_exception()
except ValueError as err:
    errmsg = \'My custom error         


        
相关标签:
12条回答
  • 2020-12-12 09:51

    None of the above solutions did exactly what I wanted, which was to add some information to the first part of the error message i.e. I wanted my users to see my custom message first.

    This worked for me:

    exception_raised = False
    try:
        do_something_that_might_raise_an_exception()
    except ValueError as e:
        message = str(e)
        exception_raised = True
    
    if exception_raised:
        message_to_prepend = "Custom text"
        raise ValueError(message_to_prepend + message)
    
    0 讨论(0)
  • 2020-12-12 09:57

    Update: For Python 3, check Ben's answer


    To attach a message to the current exception and re-raise it: (the outer try/except is just to show the effect)

    For python 2.x where x>=6:

    try:
        try:
          raise ValueError  # something bad...
        except ValueError as err:
          err.message=err.message+" hello"
          raise              # re-raise current exception
    except ValueError as e:
        print(" got error of type "+ str(type(e))+" with message " +e.message)
    

    This will also do the right thing if err is derived from ValueError. For example UnicodeDecodeError.

    Note that you can add whatever you like to err. For example err.problematic_array=[1,2,3].


    Edit: @Ducan points in a comment the above does not work with python 3 since .message is not a member of ValueError. Instead you could use this (valid python 2.6 or later or 3.x):

    try:
        try:
          raise ValueError
        except ValueError as err:
           if not err.args: 
               err.args=('',)
           err.args = err.args + ("hello",)
           raise 
    except ValueError as e:
        print(" error was "+ str(type(e))+str(e.args))
    

    Edit2:

    Depending on what the purpose is, you can also opt for adding the extra information under your own variable name. For both python2 and python3:

    try:
        try:
          raise ValueError
        except ValueError as err:
           err.extra_info = "hello"
           raise 
    except ValueError as e:
        print(" error was "+ str(type(e))+str(e))
        if 'extra_info' in dir(e):
           print e.extra_info
    
    0 讨论(0)
  • 2020-12-12 09:58

    This code template should allow you to raise an exception with a custom message.

    try:
         raise ValueError
    except ValueError as err:
        raise type(err)("my message")
    
    0 讨论(0)
  • 2020-12-12 09:59

    It seems all the answers are adding info to e.args[0], thereby altering the existing error message. Is there a downside to extending the args tuple instead? I think the possible upside is, you can leave the original error message alone for cases where parsing that string is needed; and you could add multiple elements to the tuple if your custom error handling produced several messages or error codes, for cases where the traceback would be parsed programmatically (like via a system monitoring tool).

    ## Approach #1, if the exception may not be derived from Exception and well-behaved:
    
    def to_int(x):
        try:
            return int(x)
        except Exception as e:
            e.args = (e.args if e.args else tuple()) + ('Custom message',)
            raise
    
    >>> to_int('12')
    12
    
    >>> to_int('12 monkeys')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in to_int
    ValueError: ("invalid literal for int() with base 10: '12 monkeys'", 'Custom message')
    

    or

    ## Approach #2, if the exception is always derived from Exception and well-behaved:
    
    def to_int(x):
        try:
            return int(x)
        except Exception as e:
            e.args += ('Custom message',)
            raise
    
    >>> to_int('12')
    12
    
    >>> to_int('12 monkeys')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in to_int
    ValueError: ("invalid literal for int() with base 10: '12 monkeys'", 'Custom message')
    

    Can you see a downside to this approach?

    0 讨论(0)
  • 2020-12-12 10:01
    try:
        try:
            int('a')
        except ValueError as e:
            raise ValueError('There is a problem: {0}'.format(e))
    except ValueError as err:
        print err
    

    prints:

    There is a problem: invalid literal for int() with base 10: 'a'
    
    0 讨论(0)
  • 2020-12-12 10:01

    Either raise the new exception with your error message using

    raise Exception('your error message')
    

    or

    raise ValueError('your error message')
    

    within the place where you want to raise it OR attach (replace) error message into current exception using 'from' (Python 3.x supported only):

    except ValueError as e:
      raise ValueError('your message') from e
    
    0 讨论(0)
提交回复
热议问题