* Use checked exceptions rather than special return values to indicate errors
* Unchecked exceptions should only be used for programming errors
* If you catch an InterruptedException in a synchronous method, interrupt the current thread so the caller learns about the interrupt
* RuntimeExceptions thrown by our own code are expected to crash the app, and RuntimeExceptions thrown by libraries should either be caught immediately or allowed to escape and crash the app - but shouldn't be allowed to propagate through layers of our own code before being caught.