There are several methods to resolve it:
## 1. Exception Chain ##

    raise NewException("Explain why") from CatchedException

pattern. In particular, considering Python 3 and the example given by @BrenBarn I use following 

    def failure():
        raise ValueError("Real error")

    try:
        failure()
    except ValueError as ex:
        raise TypeError("Apology error") from ex

which yields 

    --------- ValueError----                                
    Traceback (most recent call last) 
          4 try:
    ----> 5     failure()
          6 except ValueError as ex:
    
          1 def failure():
    ----> 2     raise ValueError("Real error")
          3 

    ValueError: Real error
    
    The above exception was the direct cause of the following exception:
    
    -----TypeError-----
    Traceback (most recent call last) 
          5     failure()
          6 except ValueError as ex:
    ----> 7     raise TypeError("Apology error") from ex
    
    TypeError: Apology error

## 2. Suppress Original Failure ##
You can also suppress the original exception context by raise the new exception from None. The code will change to 

    def failure():
        raise ValueError("Real error")
    
    try:
        failure()
    except ValueError as ex:
        raise TypeError("Apology error") from None

.. and it yields following output

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    Cell In[2], line 7
          5     failure()
          6 except ValueError as ex:
    ----> 7     raise TypeError("Apology error") from None
    
    TypeError: Apology error

## 3. Add Notes To Exception ##
You can also add explanation notes to original exception

    def failure(i):
        raise ValueError(f"Real error in failure method.")

    try:
        a = 3.1415
        failure(a)
    except ValueError as ex:
        ex.add_note(f'The "{ex.args[0]}" happened with argument {a} when invoked from main script.')
        ex.add_note('Final note: bye')
        raise
which yields ...

    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    Cell In[14], line 6
          4 try:
          5     a = 3.1415
    ----> 6     failure(a)
          7 except ValueError as ex:
          8     ex.add_note(f'The "{ex.args[0]}" happened with argument {a} when invoked from main script.')
    
    Cell In[14], line 2, in failure(i)
          1 def failure(i):
    ----> 2     raise ValueError(f"Real error in failure method.")
    
    ValueError: Real error in failure method.
    The "Real error in failure method." happened with argument 3.1415 when invoked from main script.
    Final note: bye