Skip to content

Debugging Tracebacks

A repeatable debugging process

When you see an exception:

  1. Read the last line (exception type + message)
  2. Go to the line number where it occurred
  3. Check the types/values of variables
  4. Create a minimal reproduction
  5. Fix and re-run

Example traceback

bug.py
def avg(nums):
    return sum(nums) / len(nums)
 
print(avg([]))
bug.py
def avg(nums):
    return sum(nums) / len(nums)
 
print(avg([]))
Traceback
Traceback (most recent call last):
  File "bug.py", line 4, in <module>
    print(avg([]))
  File "bug.py", line 2, in avg
    return sum(nums) / len(nums)
ZeroDivisionError: division by zero
Traceback
Traceback (most recent call last):
  File "bug.py", line 4, in <module>
    print(avg([]))
  File "bug.py", line 2, in avg
    return sum(nums) / len(nums)
ZeroDivisionError: division by zero

Fix approach

  • The list is empty, so len(nums)len(nums) is 0.
  • Decide policy: return NoneNone, raise a clear error, or handle with default.
fix.py
def avg(nums):
    if len(nums) == 0:
        raise ValueError("avg() requires at least one number")
    return sum(nums) / len(nums)
 
print(avg([10, 20]))
fix.py
def avg(nums):
    if len(nums) == 0:
        raise ValueError("avg() requires at least one number")
    return sum(nums) / len(nums)
 
print(avg([10, 20]))

Quick tip: print types

type_debug.py
value = "10"
print(type(value), value)
print(int(value))
type_debug.py
value = "10"
print(type(value), value)
print(int(value))

Optional: use the debugger

Python has a built-in debugger.

pdb_example.py
import pdb
 
x = 10
pdb.set_trace()
print(x)
pdb_example.py
import pdb
 
x = 10
pdb.set_trace()
print(x)

Useful commands inside the debugger:

  • nn next
  • ss step into
  • p varp var print variable
  • cc continue

๐Ÿงช Try It Yourself

Exercise 1 โ€“ Read a Traceback

Exercise 2 โ€“ Traceback Module

Exercise 3 โ€“ Get Traceback as String

If this helped you, consider buying me a coffee โ˜•

Buy me a coffee

Was this page helpful?

Let us know how we did