Debugging Tracebacks
A repeatable debugging process
When you see an exception:
- Read the last line (exception type + message)
- Go to the line number where it occurred
- Check the types/values of variables
- Create a minimal reproduction
- 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 zeroTraceback
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 zeroFix 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:
nnnextssstep intop varp varprint variablecccontinue
๐งช 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 coffeeWas this page helpful?
Let us know how we did
