> The semantics of this is basically: so something broke? Ok, unlock, because it was locked correctly. If something fails while unlocking, well, let me know.

The thing here is that the `_bootstrap` call needs to be try-wrapped to catch the `unlock` exceptions too, since it can fail and raise those exceptions that we catch below.

> We cannot use the unlock from bellow because it ends up executing init_db (see bellow-er). Unless we have a boolean value failed set to True if something fails in _get_or_gen_crypto_secrets and if that's the case, it'll return after the unlock from bellow. May be that's a better approach.... thoughts?

Right, I did't realize of that call.

What about something like:

```python
secrets_problem = None
try:
    self._get_or_gen_crypto_secrets()
except Exception as e:
    secrets_problem = e

# [... all the unlock db code here ...]

# STAGE 4 - local database initialization
if secrets_problem is not None:
    self._init_db()
else:
    raise secrets_problem
```

The only thing that we may want to tackle is the possibility of having the "Unhandled exception when unlocking shared database." problem and not raising a possible problem with the secret generation before. Maybe other conditional?