Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Everything is broken, and I don't know why. Python edition.

Everything is broken, and I don't know why. Python edition.

SF Python
October 12th 2016

Matt Robenolt

October 12, 2016
Tweet

More Decks by Matt Robenolt

Other Decks in Programming

Transcript

  1. Everything is broken, and I don’t know why. Python edition

    SF Python October 12th 2016 Matt Robenolt
  2. If an exception happens in production, and nobody sees the

    logs, did it really happen? — Taylor Swift “ ”
  3. #include <stdio.h> int main () { FILE *fp; char buf[100];

    fp = fopen("foo.txt", "r"); fgets(buf, 100, fp); fclose(fp); } Errors in: C
  4. #include <stdio.h> int main () { FILE *fp; char buf[100];

    fp = fopen("foo.txt", "r"); fgets(buf, 100, fp); fclose(fp); } Errors in: C [1] 53482 segmentation fault ./a.out
  5. #include <stdio.h> int main () { FILE *fp; char buf[100];

    fp = fopen("foo.txt", “r"); if (fp != NULL) { fgets(buf, 100, fp); fclose(fp); } } Errors in: C
  6. package main import "os" func main() { buf := make([]byte,

    100) fp, _ := os.Open("foo.txt") fp.Read(buf) fp.Close() } Errors in: Go
  7. package main import "os" func main() { buf := make([]byte,

    100) fp, _ := os.Open("foo.txt") fp.Read(buf) fp.Close() } Errors in: Go jk nothing happens
  8. package main import "os" func main() { buf := make([]byte,

    100) fp, err := os.Open(“foo.txt") if err == nil { fp.Read(buf) fp.Close() } } Errors in: Go
  9. use std::fs::File; use std::io::Read; fn main() { let mut fp

    = File::open("foo.txt").unwrap(); let mut buf = [0; 100]; fp.read_exact(&mut buf); drop(fp); } Errors in: Rust
  10. use std::fs::File; use std::io::Read; fn main() { let mut fp

    = File::open("foo.txt").unwrap(); let mut buf = [0; 100]; fp.read_exact(&mut buf); drop(fp); } Errors in: Rust thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { repr: Os { code: 2, message: "No such file or directory" } }', ../src/ libcore/result.rs:788 note: Run with `RUST_BACKTRACE=1` for a backtrace.
  11. use std::fs::File; use std::io::Read; fn main() { match File::open("foo.txt") {

    Ok(mut fp) => { let mut buf = [0; 100]; fp.read_exact(&mut buf); drop(fp); }, Err(_) => { // }, } } Errors in: Rust
  12. fp = open('foo.txt', 'r') buf = fp.read(100) fp.close() Errors in:

    Python Traceback (most recent call last): File "main.py", line 1, in <module> fp = open('foo.txt', 'r') IOError: [Errno 2] No such file or directory: 'foo.txt'
  13. try: fp = open('foo.txt', 'r') except IOError: pass else: buf

    = fp.read(100) fp.close() Errors in: Python
  14. try: fp = open('foo.txt', 'r') except IOError: pass else: buf

    = fp.read(100) fp.close() Errors in: Python Exceptions
  15. Errors Non-fatal, multiple may exist within a call stack at

    the same time, generally returned as a value.
  16. Exceptions Fatal, must be handled, only one exists within a

    call stack, raised to abort current execution.
  17. Exceptions Fatal, must be handled, only one exists within a

    call stack, raised to abort current execution.
  18. Traceback (most recent call last): File "main.py", line 1, in

    <module> fp = open('foo.txt', 'r') IOError: [Errno 2] No such file or directory: 'foo.txt'
  19. Traceback (most recent call last): File "main.py", line 1, in

    <module> fp = open('foo.txt', 'r') IOError: [Errno 2] No such file or directory: 'foo.txt' So what do we do with this thing?
  20. Traceback (most recent call last): File "main.py", line 1, in

    <module> fp = open('foo.txt', 'r') IOError: [Errno 2] No such file or directory: 'foo.txt' So what do we do with this thing? …and where does it come from?
  21. import sys def excepthook(type, value, tb): print(type, value, tb) sys.excepthook

    = excepthook fp = open('foo.txt', 'r') buf = fp.read(100) fp.close()
  22. import sys def excepthook(type, value, tb): print(type, value, tb) sys.excepthook

    = excepthook fp = open('foo.txt', 'r') buf = fp.read(100) fp.close() (<type 'exceptions.IOError'>, IOError(2, 'No such file or directory'), <traceback object at 0x106810ea8>)
  23. import sys def excepthook(type, value, tb): import traceback traceback.print_exception(type, value,

    tb) sys.excepthook = excepthook fp = open('foo.txt', 'r') buf = fp.read(100) fp.close()
  24. import sys def excepthook(type, value, tb): import traceback traceback.print_exception(type, value,

    tb) sys.excepthook = excepthook fp = open('foo.txt', 'r') buf = fp.read(100) fp.close() Traceback (most recent call last): File "main.py", line 9, in <module> fp = open('foo.txt', 'r') IOError: [Errno 2] No such file or directory: 'foo.txt'
  25. try: fp = open('foo.txt', 'r') except IOError: import sys print(sys.exc_info())

    else: buf = fp.read(100) fp.close() (<type 'exceptions.IOError'>, IOError(2, 'No such file or directory'), <traceback object at 0x106810ea8>)
  26. try: fp = open('foo.txt', 'r') except IOError: import sys, traceback

    traceback.print_exception(*sys.exc_info()) else: buf = fp.read(100) fp.close()
  27. try: fp = open('foo.txt', ‘r') except IOError: import traceback traceback.print_exc()

    else: buf = fp.read(100) fp.close() Traceback (most recent call last): File "main.py", line 2, in <module> fp = open('foo.txt', 'r') IOError: [Errno 2] No such file or directory: 'foo.txt'
  28. $ cat errors.log raise Exception() Exception Traceback (most recent call

    last): File "main.py", line 3, in <module> raise Exception() Exception Traceback (most recent call last): File "main.py", line 3, in <module> raise Exception() Exception Traceback (most recent call last): File "main.py", line 3, in <module> raise Exception() Exception Traceback (most recent call last): File "main.py", line 3, in <module>
  29. $ cat errors.log Traceback (most recent call last): File "main.py",

    line 4, in <module> my_thing = things[key] KeyError: 'thing1' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing2' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing3' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing4'
  30. $ cat errors.log Traceback (most recent call last): File "main.py",

    line 4, in <module> my_thing = things[key] KeyError: 'thing1' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing2' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing3' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing4'
  31. Traceback (most recent call last): File "main.py", line 4, in

    <module> my_thing = things[key] KeyError: 'thing1' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing2' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing3' Traceback (most recent call last): File "main.py", line 4, in <module> my_thing = things[key] KeyError: 'thing4'
  32. things = {} key = sys.argv[1] try: my_thing = things[key]

    except KeyError: import traceback traceback.print_exc() print(globals(), locals())
  33. things = {} key = sys.argv[1] try: my_thing = things[key]

    except KeyError: import traceback traceback.print_exc() print(globals(), locals())
  34. things = {} key = sys.argv[1] try: my_thing = things[key]

    except KeyError: import traceback traceback.print_exc() print(globals(), locals()) Traceback (most recent call last): File "main.py", line 5, in <module> things[key] KeyError: 'thing' ({'things': {},'key': 'thing'}, {'things': {}, 'key': 'thing'})
  35. things = {} key = sys.argv[1] try: my_thing = things[key]

    except KeyError: import traceback traceback.print_exc() print(globals(), locals()) Traceback (most recent call last): File "main.py", line 5, in <module> things[key] KeyError: 'thing' ({'things': {},'key': 'thing'}, {'things': {}, 'key': 'thing'})
  36. things = {} key = sys.argv[1] try: my_thing = things[key]

    except KeyError: import traceback, json, sys json.dump({ 'exc': traceback.format_exc(), 'globals': globals(), 'locals': locals(), }, sys.stderr)
  37. things = [0, 1, 2] def get_random_thing(n): return get_thing(randint(0, n))

    def get_thing(index): try: return things[index] except IndexError: print(locals()) get_random_thing(10)
  38. things = [0, 1, 2] def get_random_thing(n): return get_thing(randint(0, n))

    def get_thing(index): try: return things[index] except IndexError: print(locals()) get_random_thing(10) {'index': 8}
  39. def debug(): import sys tb = sys.exc_info()[2] idx = 0

    while tb: idx += 1 frame = tb.tb_frame code = frame.f_code print({ 'line': tb.tb_lineno, 'locals': frame.f_locals, 'function': code.co_name, }) tb = tb.tb_next try: get_random_thing(10) except Exception: debug()
  40. def debug(): import sys tb = sys.exc_info()[2] idx = 0

    while tb: idx += 1 frame = tb.tb_frame code = frame.f_code print({ 'line': tb.tb_lineno, 'locals': frame.f_locals, 'function': code.co_name, }) tb = tb.tb_next try: get_random_thing(10) except Exception: debug() {'function': ‘<module>', 'line': 31, 'locals': {'things': [0, 1, 2]}} {'function': 'get_random_thing', 'line': 7, 'locals': {'n': 4}} {'function': 'get_thing', 'line': 11, 'locals': {'index': 4}}