C ++

Обробка винятків у C ++

Обробка винятків у C ++
Існують три типи програмних помилок. Це синтаксичні помилки, логічні помилки та помилки виконання.

Синтаксичні помилки

Неправильно набраний вираз, оператор або конструкція є синтаксичною помилкою.

Розглянемо наступні два твердження:

int arr [] = 1, 2, 3; // правильний
int arr = 1, 2, 3; // синтаксична помилка, відсутня []

Вони є визначеннями одного і того ж масиву. Перший правильний. Другий відсутній [], і це синтаксична помилка. Програму з синтаксичною помилкою не вдається скомпілювати. Помилка компіляції із повідомленням про помилку із зазначенням синтаксичної помилки. Добре, що синтаксичну помилку завжди можна виправити, якщо програміст знає, що робить.

Помилка логіки

Логічна помилка - це помилка, допущена програмістом, коли зроблено неправильне логічне кодування. Це може бути наслідком незнання програмістом особливостей мови програмування або нерозуміння того, що програма повинна робити.

У цій ситуації програма складена успішно. Програма працює нормально, але вона дає неправильні результати. Така помилка може бути через те, що цикл повторюється 5 разів, коли робиться ітерація 10 разів. Також може бути так, що цикл несвідомо зроблений для нескінченної ітерації. Єдиний спосіб вирішити подібну помилку - це ретельне програмування та ретельне тестування програми, перш ніж передати її замовнику.

Помилки виконання

Неправильне або виняткове введення спричиняє помилки виконання. У цьому випадку програма була складена успішно і добре працює у багатьох ситуаціях. У певних ситуаціях програма аварійно завершує роботу (і зупиняється).

Уявіть, що в сегменті програмного коду 8 потрібно розділити на кількість знаменників. Отже, якщо чисельник 8 розділити на знаменник 4, відповідь (частка) буде 2. Однак, якщо користувач вводить 0 як знаменник, програма не працює. Ділення на 0 заборонено в математиці, а також не допускається в обчисленнях. Ділення на нуль слід запобігати програмуванню. Обробка винятків обробляє помилки виконання, наприклад, поділ на нуль. Наступна програма показує, як вирішити проблему поділу на нуль без використання функції винятку в C ++:

#включати
використання простору імен std;
int main ()

int чисельник = 8;
знаменник int = 2;
якщо (знаменник != 0)

int результат = чисельник / знаменник;
кут << result << '\n';

ще

кут << "Division by zero is not permitted!" << '\n';

повернути 0;

Вихід - 4. Якби знаменник дорівнював 0, виходило б:

“Ділення на нуль заборонено!"

Основним кодом тут є конструкція if-else. Якщо знаменник не дорівнює 0, відбудеться ділення; якщо воно дорівнює 0, поділ не відбудеться. Користувачеві буде надіслано повідомлення про помилку, і програма продовжує працювати без збоїв. Помилки під час виконання зазвичай обробляються, уникаючи виконання сегмента коду та надсилаючи користувачеві повідомлення про помилку.

Функція винятку в C ++ використовує try-block для if-block та catch-block для else-блоку для обробки помилки, як описано нижче:

#включати
використання простору імен std;
int main ()

int чисельник = 8;
знаменник int = 2;
спробуй

якщо (знаменник != 0)

int результат = чисельник / знаменник;
кут << result << '\n';

ще

кидок 0;


спіймати (int err)

якщо (помилка == 0)
кут << "Division by zero is not permitted!" << '\n';

повернути 0;

Зверніть увагу, що заголовок try не має аргументу. Також зауважте, що блок catch, подібний до визначення функції, має параметр. Тип параметра повинен бути таким самим, як операнд (аргумент) виразу throw. Вираз throw є у блоці try. Він видає аргумент за вибором програміста, який пов'язаний з помилкою, і блок catch ловить його. Таким чином, код у блоці try не виконується. Потім блок catch відображає повідомлення про помилку.

У цій статті пояснюється обробка винятків у C++. Базові знання на C ++ є необхідною умовою для розуміння читачем цієї статті.

Зміст статті:

  • Функція створення винятку
  • Більше одного блоку блокування для одного блоку спроб
  • Вкладені блоки спроб / лову
  • noexcept-специфікатор
  • Спеціальна функція std :: terminate ()
  • Висновок

Викид функції:

Функція може також створити виняток, як і те, що робить блок спроб. Метання відбувається в межах визначення функції. Наступна програма це ілюструє:

#включати
використання простору імен std;
void fn (const char * str)

if (islower (str [0]))
кинути 'l';

int main ()

спробуй

fn ("коваль");

зловити (char ch)

якщо (ch == 'l')
кут << "Person's name cannot begin in lowercase!" << '\n';

повернути 0;

Зверніть увагу, що цього разу блок try має лише виклик функції. Саме функція, що викликається, має операцію кидка. Блок catch ловить виняток, і результат:

“Ім'я особи не може починатися з малих літер!"

Цього разу тип кинутий і зловлений - це знак.

Більше одного блокування для одного блоку спроб:

Для одного блоку спроб може бути більше одного блоку catch. Уявіть ситуацію, коли введенням може бути будь-який із символів клавіатури, але не цифра і не алфавіт. У цьому випадку має бути два блоки блоків: один для цілого числа для перевірки цифри та другий для символу для перевірки алфавіту. Наступний код ілюструє це:

#включати
використання простору імен std;
char input = '*';
int main ()

спробуй

if (isdigit (вхід))
кидок 10;
if (isalpha (input))
кинути 'z';

спіймати (int)

кут << "Digit input is forbidden!" << '\n';

зловити (char)

кут << "Character input is forbidden!" << '\n';

повернути 0;

Виходу немає. Якщо значення вводу було цифрою, e.g., '1', висновок мав би бути:

"Введення цифр заборонено!"

Якщо значення введеного алфавіту, e.g., 'a', результат мав би бути:

"Введення символів заборонено!"

Зверніть увагу, що в списку параметрів двох блоків catch не існує ідентифікатора. Також зауважте, що у визначенні двох блоків catch, конкретні викинуті аргументи не були перевірені, чи є їх значення точними чи ні.

Для улову важливий тип; улов повинен відповідати типу викинутого операнда. Конкретне значення викинутого аргументу (операнда) може бути використано для подальшої перевірки, якщо це необхідно.

Більше одного обробника для одного типу

Можна мати два обробники одного типу. Коли виникає виняток, керування передається найближчому обробнику з відповідним типом. Наступна програма це ілюструє:

#включати
використання простору імен std;
char input = '1';
int main ()

спробуй

if (isdigit (вхід))
кидок 10;

спіймати (int)

кут << "Digit input is forbidden!" << '\n';

спіймати (int)

кут << "Not allowed at all: digit input!" << '\n';

повернути 0;

Результат:

"Введення цифр заборонено!"

Вкладені блоки спроби / лову:

блоки try / catch можуть бути вкладеними. Наведена вище програма для введення небуквено-цифрових символів з клавіатури тут повторюється, але з вкладеним алфавітним кодом помилки:

#включати
використання простору імен std;
char input = '*';
int main ()

спробуй

if (isdigit (вхід))
кидок 10;
спробуй

if (isalpha (input))
кинути 'z';

зловити (char)

кут << "Character input is forbidden!" << '\n';


спіймати (int)

кут << "Digit input is forbidden!" << '\n';

повернути 0;

Блок помилок алфавітний try / catch-block вкладений у блок спроб цифрового коду. Робота цієї програми та попередньої операції, з якої вона копіюється, однакові.

noexcept-специфікатор

Розглянемо таку функцію:

порожнеча fn (const char * str) не окрім

if (islower (str [0]))
кинути 'l';

Зверніть увагу на специфікатор 'noexcept' відразу після правої дужки списку параметрів функції. Це означає, що функція не повинна створювати виняток. Якщо функція видає виняток, як у цьому випадку, вона компілюється із попереджувальним повідомленням, але не запускається. Спроба запустити програму викликає спеціальну функцію std :: terminate (), яка повинна витончено зупинити програму, а не просто дозволити їй буквально збій.

Специфікатор noexcept має різні форми. Вони такі:

введіть func () noexcept; : не дозволяє вираз кидка
введіть func () noexcept (true); : дозволяє вираз кидка
введіть func () throw (); : не дозволяє вираз кидка
введіть func () noexcept (false); : дозволяє вираз кидка, який не є обов’язковим
введіть func (); : дозволяє вираз кидка, який не є обов’язковим

true або false у дужках може бути замінено виразом, результатом якого є true або false.

Спеціальна функція std :: terminate ():

Якщо виняток неможливо обробити, його слід повторно кинути. У цьому випадку викинутий вираз може мати або не мати операнд. Спеціальна функція std :: terminate () буде викликана під час виконання, що має витончено зупинити програму, а не просто дозволити їй буквально збій.

Введіть, скомпілюйте та запустіть таку програму:

#включати
використання простору імен std;
char input = '1';
int main ()

спробуй

if (isdigit (вхід))
кидок 10;

спіймати (int)

кидати;

повернути 0;

Після успішної компіляції програма завершується без запуску, а повідомлення про помилку з комп'ютера автора:

“Термінант, що викликається після викиду екземпляра 'int'

Перервано (ядро скинуто) »

Висновок:

Функція винятку в C ++ перешкоджає виконанню сегмента коду на основі якогось вводу. Програма продовжує виконуватись у міру необхідності. Конструкція виключення (запобігання помилкам) складається з блоку спроб та блоку catch. Блок спроб має цікавий сегмент коду, який може бути обійдений, залежно від деяких умов введення. Блок try має вираз throw, який кидає операнд. Цей операнд також називають винятком. Якщо тип операнда та тип для параметра блоку catch однакові, то виняток ловиться (обробляється). Якщо виняток не буде виявлено, програма буде припинена, але все ж будьте в безпеці, оскільки сегмент коду, який повинен був бути виконаний для отримання неправильного результату, не був виконаний. Типова обробка винятків означає обхід сегмента коду та надсилання повідомлення про помилку користувачеві. Сегмент коду виконується для звичайного введення, але обходить для неправильного введення.

Mouse left-click button not working on Windows 10
If you are using a dedicated mouse with your laptop, or desktop computer but the mouse left-click button is not working on Windows 10/8/7 for some rea...
Cursor jumps or moves randomly while typing in Windows 10
If you find that your mouse cursor jumps or moves on its own, automatically, randomly while typing in Windows laptop or computer, then some of these s...
How to reverse Mouse and Touchpads scrolling direction in Windows 10
Mouse and Touchpads not only make computing easy but more efficient and less time-consuming. We cannot imagine a life without these devices, but still...