Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Анвар Рамазанов "Поговорим про исключения"

Анвар Рамазанов "Поговорим про исключения"

Анвар расскажет о подходах к обработке исключительных ситуаций, возможных исключениях в ходе работы приложения и подходы для их обработки.

DotNetRu

August 13, 2019
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. 1) Позволяет разделять место обнаружения ошибки и место реакции на

    неё 2) Не накладывает на программиста обязанности проверять каждый вызов каждой функции, чтобы не потерять случайно возникшую ошибку, 3) Есть в 1С :)
  2. Use Exceptions Rather Than Return Codes It is much cleaner

    code when the error is handled by exceptions rather than returned values. Using conditions on the returned value to handle error becomes difficult to read and easy to forget to check errors. Роберт Мартин (aka дядюшка Боб)
  3. 1. ArgumentException 2. ArgumentNullException 3. PathTooLongException 4. DirectoryNotFoundException 5. IOException

    6. UnauthorizedAccessException 7. FileNotFoundException 8. NotSupportedException 9. SecurityException 10. OutOfMemoryException 11. AccessViolationException 12. TypeInitializationException
  4. void методы 1) Исключения не детерминированные 2) Используйте AsyncContext из

    AsyncEx Task методы 1) Исключения хранятся в Task 2) Исключения оборачиваются в AggregatedException 3) При формирование цепочек задач с параметром TaskCreationOptions.Attache dToParent мы можем потерять исключения (даже в AggregatedException)
  5. • Необработанные исключения, как правило, вызывают завершение работы приложения •

    Для управления потоками есть два вида исключений - ThreadAbortException, AppDomainUnloadedException • Потоки запрещено завершать в блоках catch и finally
  6. • Невозможно перехватить (без танцев с бубном) • RuntimeHelpers.EnsureSufficientExecutionStack(); /

    RuntimeHelpers.TryEnsureSufficientExecutionStack() • 512 KB – x86, AnyCPU, 2 MB – x64 (half of stack size), 64/128 KB — .NET Core
  7. • Ограничения .NET на размер объекта - 2 Gb (c

    gcAllowVerLargeObject - 4) • Не всегда причина - нехватка памяти ◦ Индекс не может быть больше 2,146,435,071 (2,147,483,591) • Трудно что-то делать дальше
  8. • STATUS_NO_MEMORY -> OutOfMemoryException • STATUS_ACCESS_VIOLATION a) legacyNullReferencePolicy -> NullReferenceException

    b) Вне JIT -> AccessViolationException c) В JIT, но память вне раздела -> NullReferenceException SEHException • В остальных случая выбрасывается SEHException
  9. • Нельзя обработать, если вызвано в нативном коде • Нельзя

    отловить в .NET Core • Различное поведение в разных версиях .NET 1 - отсутсвует .NET 2 - можно отловить .NET 4 - по дефолту ловится в HandledProcessCorruptedStateException, С legacyCorruptedStateExceptionPolicy - все работает как в .NET 2 .NET Core - есть, отловить нельзя
  10. • Джефри Рихтер. CLR via C# • MSDN https://docs.microsoft.com/en-us/dotnet/standard/exceptions/ •

    DotnetBook: https://github.com/sidristij/dotnetbook • Доклад с Dotnext: https://habr.com/en/company/jugru/blog/426045 • Блог Adam Furmanek https://blog.adamfurmanek.pl/