This has become apparent as a part of the discussion here:
https://groups.google.com/forum/#!topic/php-fig/T4mtQc6qyaE
If Flysystem is used in a framework that catches errors and warnings, often converting them into exceptions, then the error handling within Flysystem will be bypassed. So if you try to open a file in a directory that can't be accessed, for example, you will expect to be given a "false" when you try to read or write that file. However, if you use a library like Asplode, you don't get to see the result, and instead are thrown into the exception handling system.
You can, of course, try...catch the exception, but for a low-level library that could sit under a huge stack of other libraries, it needs to act on errors consistently.
You could decide that it would be better to return exceptions now, so anyone using FlySystem should code to expect exceptions, then a library like Asplode won't break anything using your library.
Or maybe you want to always return false and hide any exceptions, so you need to (@) suppress PHP warnings on the file operations and handle just return codes.
Related to this, the following will be an error:
$fs = new Filesystem(new Adapter('/');
However, $fs will still be returned as a Filesystem object, and you have no idea it has failed. But enable Asplode and an exception is raised, which can be caught. That is leading me down the route of expecting exceptions to be raised by FlySystem, since some errors can happen several levels deep and get ignored (like in new... above) when the exceptional program flow should really be dealt with immediately.
Just on the above example, maybe if an error happens in any call to fopen() or likewise, and you decide NOT to raise an exception, then perhaps FlySystem should record the error and its message in the filesystem object. That way after $fs is returned above, there is a further check that can be done to make sure it actually worked, and then to get the error details for context and logging.
Hope that makes sense.