Тема 28. Винятки. Навіщо вони потрібні PDF

Summary

Цей документ обговорює важливість обробки помилок у програмуванні. Він демонструє використання винятків як метод для попередження потенційних помилок.

Full Transcript

Тема 28. Винятки. Навіщо вони потрібні? При написанні повторно використовуваного коду виникає необхідність в обробці помилок. Одним з найбільш поширених способів обробки потенційних помилок є використання кодів повернення (або «кодів завершення»), які повертає оператор return. Наприклад: int f...

Тема 28. Винятки. Навіщо вони потрібні? При написанні повторно використовуваного коду виникає необхідність в обробці помилок. Одним з найбільш поширених способів обробки потенційних помилок є використання кодів повернення (або «кодів завершення»), які повертає оператор return. Наприклад: int findFirstChar(const char* string, char ch) { // Перебираємо кожний символ рядка for (int index=0; index < strlen(string); ++index) // Якщо поточний символ співпадає зі значенням змінної ch, то повертаємо індекс цього символу if (string[index] == ch) return index; // Якщо збігу не виявлено, то повертаємо -1 return -1; } Ця функція повертає індекс першого символу переданого рядка, який збігається зі значенням змінної ch. Якщо символ не знайдено, то функція повертає -1 в якості індикатора помилки. Головною перевагою цього підходу є його простота. Однак є ряд недоліків, які можуть швидко проявитися в нетривіальних ситуаціях. По-перше, значення, що повертаються, не завжди зрозумілі. Якщо функція повертає -1, то чи означає це якусь специфічну помилку чи може це взагалі коректне значення? Часто важко зрозуміти, не маючи перед очима код самої функції. По-друге, функції можуть повертати лише одне значення. А що, якщо нам потрібно буде повернути як результат виконання функції, так і код завершення? Наприклад: double divide(int a, int b) { return static_cast(a)/b; } Тут потрібен механізм обробки помилок, тому що, якщо користувач передасть 0 в якості параметра b, відбудеться збій. Крім того, функція також повинна повернути і результат виконання операції static_cast(a)/b. Як же це зробити? Один з варіантів — повернення результату операції або коду завершення по посиланню, наприклад: #include double divide(int a, int b, bool &success) { if (b == 0) { success = false; return 0.0; } success = true; return static_cast(a)/b; } int main() { bool success; double result = divide(7, 4, success); // ми зараз передаємо значення типу bool, щоб знати наперед, чи буде операція успішною if (!success) // перевіряємо результат виконання операції перед фактичним використанням result std::cerr

Use Quizgecko on...
Browser
Browser