Исключительные ситуации
Схема обработки исключений Try { //охраняемый блок trow (new MyException();) } catch(MyExeption e) { … } catch(Exeption e){ … } finally { … }
Схема Бертрана обработки исключений Принцип «проектирования по контракту». Вызывающий модуль обязан обеспечить истинность предусловия, необходимого для корректной работы вызванного модуля. Вызванный модуль обязан гарантировать истинность постусловия по завершении своей работы. Действия обработчика: Retry - попытаться внести некоторые коррективы и вернуть управление охраняемому модулю, который может предпринять очередную попытку выполнить свой контракт. Rescue, выбрасывая исключение и передавая управление вызывающему модулю, который и должен теперь попытаться исправить ситуацию.
Схема с возобновлением public void Pattern(){ do { try { bool Danger = false; Success = true; MakeJob(); Danger = CheckDanger(); if (Danger) throw (new MyException()); MakeLastJob(); } catch (MyException me) { if(count > maxcount) throw(new MyException("Три попытки были безуспешны")); // throw(new MyException(Три попытки были безуспешны", me)); Success = false; count++; Console.WriteLine("Попытка исправить ситуацию!"); level +=1; } }while (!Success); }
public class MyException :Exception{ public MyException() {} public MyException (string message) : base(message) {} public MyException (string message, Exception e) : base(message, e) {} } class Excepts{ Random rnd = new Random(); int level = -10; bool Success; int count =1; // число попыток выполнения const int maxcount =3; void MakeJob(){ Console.WriteLine("Подготовительные работы завершены"); } bool CheckDanger(){ int low = rnd.Next(level,10); if ( low > 6) return(false); return(true); } void MakeLastJob(){ Console.WriteLine("Все работы завершены успешно"); } static void Main(string[] args) { Excepts ex1 = new Excepts(); try { ex1.Pattern(); } catch (Exception e) { Console.WriteLine("исключительная ситуация при вызове Pattern"); // PrintProperties(e); Console.WriteLine(e.ToString()); }
static public void PrintProperties(Exception e){ Console.WriteLine("Свойства исключения:"); Console.WriteLine("TargetSite = {0}", e.TargetSite); Console.WriteLine("Source = {0}", e.Source); Console.WriteLine("Message = {0}",e.Message); if (e.InnerException == null) Console.WriteLine("InnerException = null"); else Console.WriteLine("InnerException = {0}", e.InnerException. Message); Console.WriteLine("StackTrace = {0}", e.StackTrace); Console.WriteLine("GetBaseException = {0}", e.GetBaseException()); }
Класс Exception Message - строка, задающая причину возникновения исключения. Значение этого свойства устанавливается при вызове конструктора класса, когда создается объект, задающий исключение; HelpLink - ссылка (URL) на файл, содержащий подробную справку о возможной причине возникновения исключительной ситуации и способах ее устранения; InnerException - ссылка на внутреннее исключение. Когда обработчик выбрасывает новое исключение для передачи обработки на следующий уровень, то текущее исключение становится внутренним для вновь создаваемого исключения; Source - имя приложения, ставшего причиной исключения; StackTrace - цепочка вызовов - методы, хранящиеся в стеке вызовов в момент возникновения исключения; TargetSite - метод, выбросивший исключение. Метод GetBaseException. При подъеме по цепочке вызовов он позволяет получить исходное исключение - первопричину возникновения последовательности выбрасываемых исключений.