Bird
Raised Fist0
Pythonprogramming~20 mins

Exception hierarchy in Python - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Exception Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of exception handling with hierarchy
What is the output of this code snippet?
Python
class MyError(Exception):
    pass

class MySubError(MyError):
    pass

try:
    raise MySubError("Oops")
except MyError:
    print("Caught MyError")
except Exception:
    print("Caught Exception")
ANo output
BCaught Exception
CRuntimeError
DCaught MyError
Attempts:
2 left
💡 Hint
Remember that catching a base exception also catches its subclasses.
Predict Output
intermediate
2:00remaining
Exception hierarchy and multiple except blocks
What will be printed when this code runs?
Python
try:
    raise KeyError('key')
except LookupError:
    print('Caught LookupError')
except KeyError:
    print('Caught KeyError')
ACaught LookupError
BCaught KeyError
CNo output
DKeyError not caught
Attempts:
2 left
💡 Hint
Check the order of except blocks and exception inheritance.
Predict Output
advanced
2:30remaining
Output of exception chaining with hierarchy
What is the output of this code?
Python
class BaseError(Exception):
    pass

class DerivedError(BaseError):
    pass

try:
    try:
        raise DerivedError('inner')
    except DerivedError as e:
        raise BaseError('outer') from e
except BaseError as e:
    print(type(e).__name__)
    print(type(e.__cause__).__name__)
ADerivedError\nDerivedError
BBaseError\nBaseError
CBaseError\nDerivedError
DDerivedError\nBaseError
Attempts:
2 left
💡 Hint
Look at the exception chaining with 'from' keyword.
Predict Output
advanced
2:00remaining
Exception hierarchy and catching order
What will this code print?
Python
class A(Exception):
    pass

class B(A):
    pass

class C(B):
    pass

try:
    raise C()
except B:
    print('Caught B')
except A:
    print('Caught A')
ACaught B
BCaught A
CNo output
DRuntimeError
Attempts:
2 left
💡 Hint
The first matching except block is executed.
🧠 Conceptual
expert
1:30remaining
Identify the base class of all built-in exceptions
Which class is the base class for all built-in exceptions in Python?
AException
BBaseException
CStandardError
DError
Attempts:
2 left
💡 Hint
This class is the root of the exception hierarchy and includes system-exiting exceptions.

Practice

(1/5)
1. Which of the following is the base class for all built-in exceptions in Python?
easy
A. Exception
B. BaseException
C. Error
D. RuntimeError

Solution

  1. Step 1: Understand Python's exception hierarchy

    All exceptions in Python inherit from BaseException, which is the root of the hierarchy.
  2. Step 2: Identify the base class

    Exception inherits from BaseException, but BaseException is the top-level base class.
  3. Final Answer:

    BaseException -> Option B
  4. Quick Check:

    BaseException is the root of all exceptions [OK]
Hint: Remember: BaseException is the root of all exceptions [OK]
Common Mistakes:
  • Confusing Exception with BaseException
  • Thinking Error is a built-in base class
  • Choosing RuntimeError as base
2. Which of the following is the correct syntax to catch all exceptions except system-exiting ones?
easy
A. except SystemExit:
B. except BaseException:
C. except Exception:
D. except RuntimeError:

Solution

  1. Step 1: Recall exception hierarchy for catching exceptions

    Catching Exception catches most errors but excludes system-exiting exceptions like SystemExit and KeyboardInterrupt.
  2. Step 2: Identify correct syntax

    except Exception: is the standard way to catch all regular exceptions safely.
  3. Final Answer:

    except Exception: -> Option C
  4. Quick Check:

    Use Exception to catch all but system-exiting exceptions [OK]
Hint: Use except Exception to avoid catching system-exit errors [OK]
Common Mistakes:
  • Using except BaseException catches system exit too
  • Catching only RuntimeError misses many exceptions
  • Using except SystemExit catches only exit exceptions
3. What will be the output of this code?
try:
    x = 1 / 0
except ArithmeticError:
    print('ArithmeticError caught')
except ZeroDivisionError:
    print('ZeroDivisionError caught')
medium
A. ArithmeticError caught
B. ZeroDivisionError caught
C. No output, program crashes
D. SyntaxError

Solution

  1. Step 1: Understand exception hierarchy for ZeroDivisionError

    ZeroDivisionError is a subclass of ArithmeticError.
  2. Step 2: Check which except block matches first

    Since ArithmeticError comes before ZeroDivisionError, the first except block catches the exception.
  3. Final Answer:

    ArithmeticError caught -> Option A
  4. Quick Check:

    Parent exception catches before child [OK]
Hint: Parent exceptions catch before child exceptions in order [OK]
Common Mistakes:
  • Expecting ZeroDivisionError block to run first
  • Thinking exception order does not matter
  • Assuming program crashes without handling
4. Find the error in this code snippet:
try:
    open('file.txt')
except IOError:
    print('File error')
except FileNotFoundError:
    print('File not found')
medium
A. open() needs a mode argument
B. IOError should be replaced with Exception
C. No error, code is correct
D. FileNotFoundError should come before IOError

Solution

  1. Step 1: Understand exception hierarchy between IOError and FileNotFoundError

    FileNotFoundError is a subclass of IOError.
  2. Step 2: Check order of except blocks

    The more specific exception (FileNotFoundError) must come before the more general (IOError) to avoid unreachable code.
  3. Final Answer:

    FileNotFoundError should come before IOError -> Option D
  4. Quick Check:

    Specific exceptions must precede general ones [OK]
Hint: Place child exceptions before parent exceptions in except blocks [OK]
Common Mistakes:
  • Putting general exceptions before specific ones
  • Assuming IOError and FileNotFoundError are unrelated
  • Thinking open() requires mode argument always
5. You want to catch all exceptions except KeyboardInterrupt and SystemExit. Which is the best way to write the except block?
hard
A. except Exception:
B. except BaseException:
C. except (KeyboardInterrupt, SystemExit):
D. except (Exception, KeyboardInterrupt, SystemExit):

Solution

  1. Step 1: Recall exception hierarchy for KeyboardInterrupt and SystemExit

    Both KeyboardInterrupt and SystemExit inherit directly from BaseException, not Exception.
  2. Step 2: Choose except block that excludes these exceptions

    except Exception: catches all exceptions except KeyboardInterrupt and SystemExit, which is the desired behavior.
  3. Final Answer:

    except Exception: -> Option A
  4. Quick Check:

    Exception excludes system-exiting exceptions [OK]
Hint: Use except Exception to exclude system-exiting exceptions [OK]
Common Mistakes:
  • Using except BaseException catches everything including system exit
  • Catching KeyboardInterrupt and SystemExit explicitly when not needed
  • Combining Exception with KeyboardInterrupt in except tuple