When to catch
Use exceptions for exceptional conditions, not normal control flow. Catch what you can handle; let the rest bubble up. A common pattern is the resource-try-with-resources:
try (FileReader r = new FileReader("f.txt")) {
// auto-closed
} catch (IOException e) {
// handle
}
This guarantees resources close even if an exception occurs.