Раніше я думав, що це не так, але вчора мені довелося це зробити. Це програма, яка використовує Akka (реалізація акторської системи для JVM) для обробки асинхронних завдань. Один з акторів виконує деякі PDF-маніпуляції, і оскільки бібліотека баггі, вона StackOverflowError
раз у раз помирає .
Другий аспект полягає в тому, що Akka налаштована на вимкнення всієї системи акторів, якщо виявлена фатальна помилка JVM (наприклад, StackOverflowError).
Третій аспект полягає в тому, що ця акторська система вбудована у веб-додаток (для WTF-ish, спадщини, причин), тому коли система акторів не працює, веб-додаток не є. Чистий ефект полягає в тому, що в StackOverflowError
нашому додатку для обробки роботи стає просто порожнім веб-додатком.
Як швидке виправлення, мені довелося зловити StackOverflowError
кинутого, щоб пул ниток акторської системи не був зірваний. Це спонукає мене думати, що, можливо, іноді нормально ловити такі помилки, особливо в таких контекстах? Коли є обробка пулу потоків довільних завдань? На відміну від OutOfMemoryError
I, я не уявляю, як StackOverflowError
можна залишити програму в непослідовному стані. Після такої помилки стек очищається, тому обчислення можуть тривати нормально. Але, можливо, я пропускаю щось важливе.
Крім того, зауважте, що я все для виправлення помилки, в першу чергу (фактично я вже виправив ДП в цьому ж додатку кілька днів тому), але я дійсно не знаю, коли це може виникнути така ситуація.
Чому краще було б перезапустити процес JVM, а не ловити StackOverflowError
, позначити цю роботу як невдалу та продовжувати свою справу?
Чи є якась вагома причина ніколи не виловлювати ДП? За винятком "найкращих практик", це невиразний термін, який мені нічого не говорить.
StackOverflowException
s, як правило, пояснюється ланцюгом викликів методів, що не припиняються, - збільшення простору стеку тоді збільшує вартість пам'яті нового потоку без користі.
:-)