0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Ошибки внутри промисов обрабатываются крайне просто. Для перехвата достаточно вызвать метод catch и передать туда колбек, принимающий на вход саму ошибку:</p>
1
<p>Ошибки внутри промисов обрабатываются крайне просто. Для перехвата достаточно вызвать метод catch и передать туда колбек, принимающий на вход саму ошибку:</p>
2
<p>catch, в свою очередь, возвращает<em>promise</em>, что позволяет коду восстанавливать работу после ошибок и продолжать цепочку. Вполне нормально писать код в стиле цепочки, в которой чередуются then и catch:</p>
2
<p>catch, в свою очередь, возвращает<em>promise</em>, что позволяет коду восстанавливать работу после ошибок и продолжать цепочку. Вполне нормально писать код в стиле цепочки, в которой чередуются then и catch:</p>
3
<p>В большинстве ситуаций не имеет значения, на какой из операций возникла ошибка. Любое падение должно прерывать текущее выполнение и уходить в блок обработки ошибки. Именно так работает код с<em>try/catch</em>, и такое же поведение эмулируется промисами. Дело в том, что если возникла ошибка, то она передается по цепочке первому встреченному catch, а все встречающиеся на пути then игнорируются. Поэтому код выше можно упростить так:</p>
3
<p>В большинстве ситуаций не имеет значения, на какой из операций возникла ошибка. Любое падение должно прерывать текущее выполнение и уходить в блок обработки ошибки. Именно так работает код с<em>try/catch</em>, и такое же поведение эмулируется промисами. Дело в том, что если возникла ошибка, то она передается по цепочке первому встреченному catch, а все встречающиеся на пути then игнорируются. Поэтому код выше можно упростить так:</p>
4
<p>Семантически эти версии кода не эквивалентны. В первом случае вторая операция чтения начнет выполняться обязательно, независимо от того, как закончилась предыдущая. В последнем - если упадет первое чтение файла, то второе не будет выполнено.</p>
4
<p>Семантически эти версии кода не эквивалентны. В первом случае вторая операция чтения начнет выполняться обязательно, независимо от того, как закончилась предыдущая. В последнем - если упадет первое чтение файла, то второе не будет выполнено.</p>
5
<p>Иногда ошибку нужно генерировать самостоятельно. Самый простой способ сделать это - бросить исключение. К этому тоже надо привыкнуть.<em>try/catch</em>использовать нельзя, так как он работает с синхронным кодом, а вот бросать исключения можно. Промис сам их преобразует, как надо, и отправит по цепочке в поиске вызова catch:</p>
5
<p>Иногда ошибку нужно генерировать самостоятельно. Самый простой способ сделать это - бросить исключение. К этому тоже надо привыкнуть.<em>try/catch</em>использовать нельзя, так как он работает с синхронным кодом, а вот бросать исключения можно. Промис сам их преобразует, как надо, и отправит по цепочке в поиске вызова catch:</p>
6
<p>Другой способ - вернуть результат вызова функции Promise.reject, внутрь которой передается сама ошибка:</p>
6
<p>Другой способ - вернуть результат вызова функции Promise.reject, внутрь которой передается сама ошибка:</p>
7
<p>Помимо чисто технических моментов в обработке ошибок есть и архитектурно-организационные. Если вам приходится реализовывать асинхронные функции, которыми будут пользоваться другие люди, то никогда не подавляйте ошибки:</p>
7
<p>Помимо чисто технических моментов в обработке ошибок есть и архитектурно-организационные. Если вам приходится реализовывать асинхронные функции, которыми будут пользоваться другие люди, то никогда не подавляйте ошибки:</p>
8
<p>Перехватив ошибку, вы не оставляете шансов узнать о ней вызывающему коду. Тот, кто использует эту функцию, не сможет отреагировать на ошибочную ситуацию. Если обработка ошибки все же нужна - обрабатывайте, но не забывайте генерировать ее снова:</p>
8
<p>Перехватив ошибку, вы не оставляете шансов узнать о ней вызывающему коду. Тот, кто использует эту функцию, не сможет отреагировать на ошибочную ситуацию. Если обработка ошибки все же нужна - обрабатывайте, но не забывайте генерировать ее снова:</p>
9
9