Модуль 5: Cбои и исключения.

Презентация:



Advertisements
Похожие презентации
ДонНУ, кафедра КТ, проф.В.К.Толстых Из цикла лекций «Internet-технологии разработки приложений» для студентов 4-го курса кафедры Компьютерных технологий.
Advertisements

ДонНУ, кафедра КТ, проф.В.К.Толстых Из цикла лекций «Internet-технологии разработки приложений» для студентов 4-го курса кафедры Компьютерных технологий.
Проф. В.К.Толстых, Технологии разработки Internet- приложений ASP.NET приложения – обработка ошибок страниц и приложения, Global.aspx.
Исключительные ситуации. Схема обработки исключений Try { //охраняемый блок trow (new MyException();) } catch(MyExeption e) { … } catch(Exeption e){ …
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
Исключения в EJB Кряжев Василий
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Низкоуровневые операции в ИС. Сокеты в C#. Понятие сокета Если требуется получить доступ к сетевым операциям низкого уровня, в программе следует использовать.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Часть 1. Основы ООП Исключения.. Структурный подход Неисправимые ошибки – вывести информацию и умереть. Исправимые ошибки – уведомить вызывающую.
Отправка файла с использованием электронной почты.
Тема 3.3 Сетевая модель OSI и другие сетевые модели. Семиуровневая модель OSI. Для единого представления данных в сетях с неоднородными устройствами и.
Высокоуровневые методы информатики и программирования Лекция 14 Интерфейсы.
1 Обработка исключений в Java Одно из важнейших преимуществ Java – разработанный на уровне языка механизм обработки исключений. Исключение в Java - это.
НГТУ, каф. ВТ Исключения в С++ Макаревич Л. Г.. Что такое исключение Исключение или исключительная ситуация – возникновение непредвиденных или аварийных.
Проф. В.К.Толстых, WCF-службы: Транзакции Из цикла лекций «Internet-технологии разработки приложений» для студентов 4-го курса кафедры.
Saint Petersburg, 2011 Java Lecture #06 Exceptions.
Обработка исключительных ситуаций. Синтаксис try{ операторы0; } catch (ТипИсключения1 переменная1){ операторы1; } catch (ТипИсключения2 переменная2){
Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
Транксрипт:

Модуль 5: Cбои и исключения.

Содержание Отображение.NET Framework исключений на сервисные сбои (Service-level Faults) Использование сбоев на стороне сервиса Обработка сбоев и исключений на стороне клиента

Урок 1:Отображение.NET исключений на сервисные сбои Отображение исключений на сервисные сбои Преобразование исключений к сбоям Структура SOAP сбоя Сбои в метаданных

Отображение исключений на сервисные сбои Предоставляют стек вызова Локальная информация Специфичная информация Закрывают хост Исключения – общий метод диагностики ошибок Не очень хорошие характеристики сервиса

Преобразование исключений в сбои Service Contract Domain errors Technical errors Contract errors Design Time Run Time SOAP Fault Domain errors Technical errors Service exception handling SOAP message

Структура SOAP-Fault urn:uuid:dd129ffe-a8ff-4a70-ad6f-ad48085e94e8... s:Sender ERROR INFO APPLICATION-SPECIFIC INFORMATION

Сбои и метаданные [OperationContract] [FaultContract(typeof(BankService.NoFunds))] void Withdraw(string account, decimal amount); [OperationContract] [FaultContract(typeof(BankService.NoFunds))] void Withdraw(string account, decimal amount); метаданные

Урок 2: Использование сбоев на стороне сервиса Разработка сервисов с поддержкой сбоев Какая информация должна быть включена в сбои Типизированные и нетипизированные сбои Использование типизированных сбоев (Typed Fault) Аспекты поведения и исключения Диагностика неожиданных исключений Демонстрация: генерация и обработка исключений в WCF службе

Разработка сервисов с поддержкой обработки исключений Domain errors Technical errors Always expected ExpectedUnexpected Inform caller Handle

Какую информация включать в сбой Различная степень детализации сбоя для разных участников Конечный пользователь Поддержка на стороне клиента Поддержка на стороне сервиса

Типизированные и нетипизированные сбои [DataContract(Namespace=" public class AccountOverdrawnFault { private string accountNo; [DataMember] public string AccountNo { get { return accountNo; } set { accountNo = value; } }... } [DataContract(Namespace=" public class AccountOverdrawnFault { private string accountNo; [DataMember] public string AccountNo { get { return accountNo; } set { accountNo = value; } }... } WCF предоставляет программный интерфейс для создания SOAP сбоев Нетипизированный сбой FaultException Типизированный сбой FaultException DataContract используютс я для Typed Fault

Использование типизированных сбоев void Withdraw(string account, decimal amount) { try { bankBusinessObject.Withdraw(account, amount);... } catch (AccountOverdrawnException ex); { AccountOverdrawnFault fault = new AccountOverdrawnFault(ex.accountNo, ex.balanceBefore, ex.amount); throw new FaultException (fault)); } void Withdraw(string account, decimal amount) { try { bankBusinessObject.Withdraw(account, amount);... } catch (AccountOverdrawnException ex); { AccountOverdrawnFault fault = new AccountOverdrawnFault(ex.accountNo, ex.balanceBefore, ex.amount); throw new FaultException (fault)); }

No action Аспекты поведения службы и сбои Untyped fault Unhandled exception Domain error Expected technical error Unexpected technical error Typed fault Ongoing communication Ongoing communication Faulted channel

Способы обработки исключений Способ 1 – использовать try-catch блоки Try/catch блоки в каждой операции сервиса Преобразование исключений в сбои на основе политик Способ 2 – использовать специализированные обработчики ошибок (error handlers) Создать собственный error handler с специализированным кодом Реализовать метод IErrorHandler.HandleError Добавить обработчик в коллекцию ChannelDispatchers Удалить дублирующийся функционал из прикладного кода службы

Диагностика непредвиденных исключений По умолчанию детальная информация не передается клиенту Обеспечение требований по безопасности Проблема для диагностики исключений Устанавливаем includeExceptionDetailInFaults свойство serviceDebug Отключаем в Environment среде......

Отладка сбоев [DataContract] public class ExceptionDetail { public ExceptionDetail(Exception exception); [DataMember] public string HelpLink{get; private set;} [DataMember] public ExceptionDetail InnerException{get; private set;} [DataMember] public string Message {get; private set;} [DataMember] public StackTrace {get; private set;} [DataMember] public string Type {get; private set;} } [DataContract] public class ExceptionDetail { public ExceptionDetail(Exception exception); [DataMember] public string HelpLink{get; private set;} [DataMember] public ExceptionDetail InnerException{get; private set;} [DataMember] public string Message {get; private set;} [DataMember] public StackTrace {get; private set;} [DataMember] public string Type {get; private set;} }

Использование ExceptionDetail Создать экземпляр ExceptionDetail Инициализировать его исключением, которое должно быть доставлено клиенту Инициализируется объект FaultException Клиент перехватывает FaultException

Декларативная передача исключений [AttributeUsage(AttributeTargets.Class)] public sealed class ServiceBehaviorAttribute: Attribute, … { public bool IncludeExceptionDetailInFaults {get; set;} } [ServiceBehavior(IncludeExceptionDetailInFaults = false)] class MyService:IMyServiceContract { } [AttributeUsage(AttributeTargets.Class)] public sealed class ServiceBehaviorAttribute: Attribute, … { public bool IncludeExceptionDetailInFaults {get; set;} } [ServiceBehavior(IncludeExceptionDetailInFaults = false)] class MyService:IMyServiceContract { }

Хост и диагностика исключений ServiceHost host = new ServiceHost(typeof(MyService)); ServiceBehaviorAttribute debuggingBehavior = host.Description.Behaviors.Find (); debuggingBehavior.IncludeExceptionDetailInFaults = true; host.Open(); ServiceHost host = new ServiceHost(typeof(MyService)); ServiceBehaviorAttribute debuggingBehavior = host.Description.Behaviors.Find (); debuggingBehavior.IncludeExceptionDetailInFaults = true; host.Open();

Демонстрация Создание типизированных исключений и их использование в контрактах данных Обработка исключений на стороне сервиса

Урок 3: Обработка сбоев и исключений на стороне клиента Обработка сервисных исключений Communication Exceptions Обработка Typed Faults Обработка Untyped Faults Сбои и коммуникационные паттерны Демонстрация: обработка исключений на стороне клиента

Обработка сервисных исключений Весь remote код должен быть помещен в try/catch блок Необходимо пересоздать proxy при отказе канала Клиент должен обрабатывать: Ожидаемые исключения предметной области и технические сбои Непредвиденные технические сбои могут повредить канал Коммуникационные ошибки (приводят к отказу канала)

Коммуникационные исключения CommunicationException CommunicationObjectFaultedException TimeoutExceptionEndpointNotFound ProtocolException

Обработка типизированных сбоев try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { AccountOverdrawnFault fault = ex.Detail; Console.WriteLine("{0}. Account {1}, balance before {2}", fault.Message, fault.Account, fault.Balance); } try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { AccountOverdrawnFault fault = ex.Detail; Console.WriteLine("{0}. Account {1}, balance before {2}", fault.Message, fault.Account, fault.Balance); }

Обработка нетипизированных сбоев try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { Console.WriteLine("Service fault: {0}.", ex.Reason); } try { bankServiceProxy.Withdraw("ABC123", );... } catch (FaultException ex); { Console.WriteLine("Service fault: {0}.", ex.Reason); } Включите includeExceptionDetailInFaults для более детальной информации

Сбои и коммуникационные паттерны Duplex Сбои определяются в контрактах обратного вызова Большинство ошибок сосредоточены в request/response One-way operations Сбой не происходит при отправке сообщения Следующий вызов вызывает сбой

Сбои и обратный вызов interface IMyContractCallback { [OperationContract] void OnCallback(); } [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))] interface IMyContract { [OperationContract] [FaultContract(typeof(InvalidOperationException))] void MyMethod(); } interface IMyContractCallback { [OperationContract] void OnCallback(); } [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))] interface IMyContract { [OperationContract] [FaultContract(typeof(InvalidOperationException))] void MyMethod(); }

Отладка обратного вызова [ClientBehavior(IncludeExceptionDetailInFaults = false)] class MyClient:IMyContractCallback { ….. }

Упражнения Создать сервис который генерирует типизированный сбой Создать клиент, который обрабатывает сбой службы

Расширенная обработка ошибок Способ 1 – использовать try-catch блоки Try/catch блоки в каждой операции сервиса Преобразование исключений в сбои на основе политик Способ 2 – использовать специализированные обработчики ошибок (error handlers) Создать собственный error handler с специализированным кодом Реализовать метод IErrorHandler.HandleError Добавить обработчик в коллекцию ChannelDispatchers Удалить дублирующийся функционал из прикладного кода службы

Расширенная обработка ошибок public interface IErrorHandler { bool HandlerError(Exception error); void ProvideFault(Exception error, MessageVersion version, ref Message fault); } public interface IErrorHandler { bool HandlerError(Exception error); void ProvideFault(Exception error, MessageVersion version, ref Message fault); } Метод ProvideFault объекта расширения вызывается немедленно если в службе произошло исключение. WCF вызывает ProvideFault перед возвращением управления клиенту Метод вызывается во входном потоке

Использование ProvideFault public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error){….} void ProvideFault(Exception error, MessageVersion version, ref Message fault) { FaultException faultException = new FaultException (3); MessageFault messageFault = faultException.CreateMessageFault(); fault = Message.CreateMessage(version, messageFault, faultException.Action); } public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error){….} void ProvideFault(Exception error, MessageVersion version, ref Message fault) { FaultException faultException = new FaultException (3); MessageFault messageFault = faultException.CreateMessageFault(); fault = Message.CreateMessage(version, messageFault, faultException.Action); }

Обработка сбоев bool HandlerError(Exception error); Вызывается после возврата управления клиенту Предназначен для использования на стороне сервиса Вызывается в отдельном потоке Никак не влияет на клиента Если возвращает false вызывается метод других установленных расширений.

Пример использования public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error) { try { LogServiceClient proxy = new LogServiceClient; proxy.Log(…); proxy.Close(); } catch{} finally{ return false;} } void ProvideFault(Exception error, MessageVersion version, ref Message fault) { ….. } public class MyErrorHandler: IErrorHandler { bool HandlerError(Exception error) { try { LogServiceClient proxy = new LogServiceClient; proxy.Log(…); proxy.Close(); } catch{} finally{ return false;} } void ProvideFault(Exception error, MessageVersion version, ref Message fault) { ….. }

Установка расширений обработки ошибок public class ChannelDispatcher: ChannelDispatcherBase { public Collection ErrorHandlers{get;} } public class ChannelDispatcher: ChannelDispatcherBase { public Collection ErrorHandlers{get;} } Необходимо включить собственный обработчик в коллекцию нужного диспетчера(либо всех) службы Расширения должны добавляться до получения службой первых вызовов, но после инициализации диспетчеров. Хост уже инициализирован, но не открыт. Лучше рассматривать расширения как пользовательские аспекты поведения.

Пример установки расширений class MyErrorHandler:IErrorHandler {…} class MyService:IMyContract, IServiceBehavior { public void ApplyDispatchBehavior(ServiceDescription description, ServiceHost host) { IErrorHandler handler = new MyErrorHandler(); foreach(ChannelDispatcher dispatcher in host.ChannelDispatchers) { dispatcher.ErrorHandlers.Add(handler); } public void Validate(…){} public void AddBindingParameters(…){} } class MyErrorHandler:IErrorHandler {…} class MyService:IMyContract, IServiceBehavior { public void ApplyDispatchBehavior(ServiceDescription description, ServiceHost host) { IErrorHandler handler = new MyErrorHandler(); foreach(ChannelDispatcher dispatcher in host.ChannelDispatchers) { dispatcher.ErrorHandlers.Add(handler); } public void Validate(…){} public void AddBindingParameters(…){} }

Обсуждение вопросов 2 2 Подведение итогов урока 1 1 Подведение итогов

Лабораторная работа: Работа с интерфейсами и системными типами. Создать сервис, где обработка сбоев осуществляется с помощью IErrorHandler.HandleError Отправить решение на почту: