I believe it might not be possible to get an exception/error in this case, at least not reliably.
The peer is basically not available, so you won't receive any data anymore. If you won't send data (which does not happen if you use a HTTP download), nothing will ever happen as long as you don't implement your own timeout.
So I would go for your way of listening for network change events.
Further note:
The problem is, for a TCP connection, you (or the OS) can only detect errors:
- if you send data and there is not ACK coming back from the other side
- if the other side sends a RST or something similar.
If the other side is gone (or unreachable, in your case) and you don't send data, you can therefore not detect an error (only via your own timeout).