Обработка ошибок
DESCRIPTION
Лекция Михаила Гуренкова по обработке ошибок в рамках курса по ООП. Каф. Вычислительная математика и программирование, МАИ.TRANSCRIPT
Обработка ошибок.Исключительные ситуации
Лабораторная работа 2
30 марта
1. Основной функционал
2. Пользовательский интерфейс с заглушками
3. Отчетность: Схемы классов, реализация, шаблоны
Варианты обработки ошибок
• Код возврата
• Глобальная переменная
• Прекращение выполнения программы
• Возвращение специального объекта-результата
• Исключительные ситуации
Объект-результатpublic XCalculatedCall CalculateAndProcess(XCallInformation a_Call){ XCalculationResult result = Calculate(a_Call);
if (!result.Success) { XBillingErrors.Instance.Register(a_Call, result.Error); return null; }
return result.CalculatedCall;}
Шаблоныpublic int[] Find(string a_Needle){ if (string.IsNullOrEmpty(a_Needle)) { throw new ArgumentNullException("Строка поиска не может быть пустой."); } List<int> result = new List<int>(); int startPosition = 0; while(true) { int index = m_Haystack.IndexOf(a_Needle, startPosition); if (index == -1) { break; } result.Add(index); startPosition = index + 1; } return result.ToArray();}
Протоколированиеpublic void RegisterEvent(object a_Sender, Exception a_Excepton,
EventType a_EventType){
string message = "";Exception exception = a_Excepton;while (exception != null){
message += exception.Message + " (" + exception.GetType().FullName + ")\r\n" +
exception.StackTrace + "\r\n";exception = exception.InnerException;
}RegisterEvent(a_Sender, a_Excepton.Message + " (" + a_Excepton.GetType().FullName + ")" , message, a_EventType);
}
Минусы исключительных ситуаций• Позволяют выявить только одну ошибку
(выход из алгоритма после первой ошибки)
• Проверка производится только во время выполнения алгоритма
• Могут снижать производительность
CheckResult public static bool Test(XCheckResult
a_Result){ return a_Result.IsSucceeded;}
public static void Assert(XCheckResult a_Result)
{ if (a_Result.IsSucceeded) { return; }
if (a_Result.Exception != null) { throw a_Result.Exception; }
throw new ApplicationException(a_Result.Message);
}
public static XCheckResult Success(){ return new XCheckResult(true, "", null);}
public static XCheckResult Fail(string a_Message)
{ return new XCheckResult(false,
a_Message, null);}
public static XCheckResult Fail(Exception a_Exception)
{ return new XCheckResult(false,
a_Exception.Message, a_Exception);}