1. Do some benchmark with
```
<?php
function a($a, $b)
{
return $a + $b;
}
function aa($a, $b)
{
throw new \Exception();
return $a + $b;
}
$bag = [];
$mt = microtime(true);
for ($i = 0; $i < 100000; $i++) {
try {
a(1,2); // float(0.0023398399353027)
// aa(1, 2); // float(0.053406953811646), what 25 times slower?
} catch (\Throwable $e) {
$bag[] = $e;
}
}
var_dump(microtime(true) - $mt);
```
2. Your function is a closed case then. Any error inside that case disables
the whole function.
So the function should be as small as possible, also possible
repair/fallback/saga functions should be written.
The OOP idea is "the object prepares himself (from inside), or with
services (from outside)".
Getters/Setters is bad because only the object should know what's happening
inside.
Using exceptions you have to write super-micro functions and split your
logic to hundreds of methods, because any of them could fall with
exceptions.
And if you write a Facade that calls one function, each from that calls
10-15 internal functions - exactly that facade should decide what to do
with any occurred exception.
There are cases you CANNOT decide without third-party libraries. So you
can't write facades and you should break the encapsulation by doing small
methods instead of useful ones.
That's why exceptions are not a solution. Exceptions are a validation case
and a safe-shield (reporting to email) for cases you didn't cover because
of a lot of work.