The new behaviour is to throw when there's a permanent error (eg permission denied).
Or on some of them at least. File does not exist is pretty permanent. Anyway, it's broken.
There's lots of code that assumes that read_{file,bytes} return zero only when the file doesn't exist.
There is? I can't think of any offhand where it matters if the file is unreadable or if there is insufficient permissions. If there is that code is broken today. With the proposed change good code will break.