Solved,
AIF has one big transaction somewhere deep in the core code and an own try catch.
So when you throw an error inside AIF sevice it is going to abort the outer transaction and go to staight to the AIF catch clause, skipping all others.
That's why I couldn't catch it. Solution could be to commit AIF transaction, run your code and before return begin new transaction.