So the one thing I don't love about moving this code is that the catch is a bit overbroad — if there's some other code that needs to open a file, the message boilerplate won't be applicable. I thiiiink maybe a better answer is to add a new exception type, `EinhornSH::Halt` or something, which the `reconnect` code raises, and is caught with something like the following:

```
begin
  sh = ...
  sh.run
rescue EinhornSH::Halt => e
  Einhorn::EinhornSH.emit(e.to_s, true)
end
```