879.96K
Категория: ПрограммированиеПрограммирование

Обработка ошибок

1.

ОБРАБОТКА ОШИБОК

2.

ВИДЫ ОШИБОК
Ошибки времени компиляции
Ошибки времени выполнения
Синтаксические
Динамические семантические
Статические семантические
Логические
Скрытые ошибки

3.

СИНТАКСИЧЕСКИЕ ОШИБКИ
private string name
public Class1()
{
public override bool Solve(

4.

СТАТИЧЕСКИЕ СЕМАНТИЧЕСКИЕ
Использование неинициализированных
переменных
int i;
i++;
Несовпадение типов
int a = "hello";
Ошибки в выражениях
string s = "...";
int a = 5 - s;
Неизвестные ссылки
//using System;
namespace EventCalculus.Axioms
{
public class HoldsAtPredicate
{
public override bool Solve()
{
throw new
NotImplementedException();
}
}
}

5.

ДИНАМИЧЕСКИЕ СЕМАНТИЧЕСКИЕ
Выход индекса за пределы массива
int[] v = new int[10];
v[10] = 100;
Отсутствие блока catch при наличии оператора throw

6.

ЛОГИЧЕСКИЕ
Ошибки в логике проведения вычислений
public static int Sum(int a, int b)
{
return a - b;
}
Ошибки выхода из циклов
for (int i = 0; i < n; i--)
Ошибки ветвления

7.

СКРЫТЫЕ ОШИБКИ (LATENT ERRORS)
Деление на 0
int res = (a + b) / (c - d);
Ссылки на null
var value = truthValues.FirstOrDefault(x => x.Time == time).Value;

8.

ОТЛАДКА

9.

НЕЭФФЕКТИВНЫЙ СПОСОБ ОТЛАДКИ
Гадать где находится ошибка
Сначала делать, а потом думать
Частные исправления
Свалить все на компилятор, компьютер, язык, чужие библиотеки, иллюминатов, рептилоидов

10.

ЭФФЕКТИВНЫЙ МЕТОД ОТЛАДКИ
Собрать данные (логирование, результаты тестов и т.д.)
Сформулировать гипотезу, почему все так произошло
Разработать эксперимент, подтверждающий или опровергающий гипотезу
Оценить результат выполнения теста
Повторить

11.

ОТЛАДКА

12.

СПОСОБЫ ИЗБАВЛЕНИЯ ОТ ОШИБОК
Максимальное покрытие кода тестами
Тестирование недостатка данных
Использование утверждений
Проверка всех входных данных
Проверка доступности внешних ресурсов
Проверка на null
Грамотное разбиение кода на классы, методы и т.д.

13.

СПОСОБЫ ОБРАБОТКИ ОШИБОК
Вернуть нейтральное значение (но не Null)
Заменить следующим корректным блоком
данных
Заменить предыдущим значением
Подставить ближайшее допустимое значение
Логирование
Возврат кода ошибки
Вызвать метод обработки ошибки
Показать сообщение об ошибке
Прекратить выполнение
Сгенерировать исключение

14.

ВОЗВРАТ КОДА ОШИБКИ VS ГЕНЕРАЦИЯ ИСКЛЮЧЕНИЯ
Возврат кода ошибки
Многословность
Вызов каждого метода должен быть обернут блоком if
«Хрупкость»
Можно легко забыть написать тот самый if
Быстродействие
Неуниверсальность
Не могут быть использованы в конструкторах, операторах,
свойствах
Подразумевают использование выходных переменных
Генерация исключения
Универсальность
Могут быть использованы в операторах,
конструкторах, свойствах
Соответствуют принципу открытости/закрытости
Типизированы
Обработка ошибки находится где-то, возможно
очень далеко от места ее возникновения

15.

ПРАВИЛА РАБОТЫ С ИСКЛЮЧЕНИЯМИ
Исключения всегда должны быть обработаны
Исключения генерируются на уровне абстракции обрабатывающего их класса, то есть в терминах
обрабатывающего класса
В методе, в котором есть блок try/catch не должно быть больше ничего
Исключения должны содержать максимально возможное количество информации
Исключения не должны использоваться вместо блока if/else
English     Русский Правила