﻿# Урок 20\. Паттерн 12\. Исключения

Генерирование и обработка исключений с участием целочисленных типов не является хорошей практикой программирования на языке Си\+\+\. Для этих целей следует использовать более информативные типы, например классы, производные от класса std::exception\. Но иногда все\-таки приходится работать с менее качественным кодом, таким как показано ниже:

```cpp
char *ptr1;
char *ptr2;
try {
  try {
    throw ptr2 - ptr1;
  }
  catch (int) {
    std::cout << "catch 1: on x86" << std::endl;
  }
}
catch (ptrdiff_t) {
  std::cout << "catch 2: on x64" << std::endl;
}
```

Следует тщательно избегать генерирования или обработку исключений с использованием [memsize](https://pvs-studio.ru/ru/blog/terms/0030/)\-типов, так как это чревато изменением логики работы программы\. Исправление данного кода может заключаться в замене "catch \(int\)" на "catch \(ptrdiff\_t\)"\. А более правильным решением будет использование специального класса для передачи информации о возникшей ошибке\.

## Диагностика

На практике мы пока не встречали данный вид ошибки, хотя инструмент [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) позволяет их обнаружить\. Диагностическое сообщение [V115](https://pvs-studio.ru/ru/docs/warnings/v115/) будет выдано при попытке генерации исключения с помощью memsize\-типа, а сообщение [V116](https://pvs-studio.ru/ru/docs/warnings/v116/) при использовании memsize\-типа в операторе catch\.

_Авторы курса: Андрей Карпов \([karpov@viva64\.com](mailto:karpov@viva64.com)\), Евгений Рыжков \([evg@viva64\.com](mailto:evg@viva64.com)\)\._

_Правообладателем курса "Уроки разработки 64\-битных приложений на языке Си/Си\+\+" является ООО "Системы программной верификации"\. Компания занимается разработкой программного обеспечения в области анализа исходного кода программ\. [Сайт компании](https://pvs-studio.ru/ru/pvs-studio/)\._