Когда в дверь стучат параллельные алгоритмы, самое время подумать об обработке ошибок.
Так что сначала были коды ошибок. Те сосали Их можно было свободно игнорировать, так что вы могли допустить ошибку и создать трудный для отладки код.
Затем пришли исключения. Их было невозможно игнорировать, когда они происходят, и большинству людей (кроме Джоэла) они нравятся больше.
И теперь у нас есть библиотеки, которые помогают параллельному коду. Проблема в том, что вы не можете обрабатывать исключения в параллельном коде так же легко, как в непараллельном коде. Если вы запускаете задачу асинхронно, и она выдает исключение, за ней не остается трассировки стека, чтобы ее можно было развернуть; лучшее, что вы можете сделать, это захватить и зарегистрировать его на объекте задачи, если такой объект существует. Тем не менее, он побеждает основную силу исключений: вы должны проверять их, и вы можете игнорировать их без каких-либо дополнительных усилий , тогда как в однопоточном коде исключение обязательно вызовет соответствующие действия (даже если это означает завершение вашей программы).
Как языковые реализации или библиотеки должны поддерживать ошибки в параллельном коде?