Что такое протокол ошибок какая информация в нем содержится

�������� ������

������� �� ���� ��������:

  • SQLCODE � GDSCODE
  • ��������� ����� ����������

�������� ������

���� ��� ��� ����� ��������� �������� ������, �������, ��� ����������, ����������� � �������, �������� � ������ ���� ������, ����������� � ������. ���� �� ������ �������� � ������� ���� ������, �� ������ ��������� �������� ������ � ������ ���������� �������. � �������, ����� ����������� �������� ��� «���������» ������ ������, ���������� ������� ����� �������� ������ ���������.

���� ��� ����� ��������, ������� ����� ����������� � ����� ��������������� ����������, ����������� ������� �������. ����������� ��. � ����. «������������� ������� ������ � �������� ������» ����� 16.

! ! !

�����. � ����� ���� ����� ������� ���������� �������� ������� � ���������, ������� ��������� ������ �� ������� �������, ���� ��������� �� �������� �������� ���������������� ������.

. ! .

SQLCODE � GDSCODE

� ������ 1.5 � ���� �� ������ ����������� �������� ��� ������, ������� ���������� ��������� ������������� ���������� � ����������� ���������� SQLCODE ��� GDSCODE. ��� ������������� ������ ���������� ������ ���������������� �������� ���������� � ���� ��������� ����� ������������ ��������� ����������.

��������� ������������ ���������� ����� � SQLCODE, � GDSCODE. ��� ��� ����� ���������� ������ � ������ ����, ������ ����� ����������.

! ! !

����������. ������ ���, ����� �� ����������� ���������� � ���� ����� ��� ����� �����������, �� �������� ����.

. ! .

��������� ��������� ����� ���� ����������� ������� ������������ ����������. ������ ��� ������������ ������ SQLCODE � ���� ���������������� ����������. ��� ���������������� ���������� ����� ���� ���������� �� ������� ����� ��� �� ����������� ����� ���� ��������� ���������� ��������� � ������� ������� ��������� ���������.

���� �� ��������� �� ������ �� ��������������� ����������, � ���� ��������� ������, �� ��� ���������� �������� WHEN ANY. ��� ���������� �������� �������� ��������� ��� ������ ������ ���������, ��������� ��� SQLCODE ������ � ������� �������� �����������, ����������� �� ��������� �����:

BEGIN

. . .

WHEN SQLCODE -802 DO

EXCEPTION E_EXCEPTION_1;

WHEN SQLCODE -803 DO

EXCEPTION E_EXCEPTION_2;

WHEN ANY DO

EXECUTE PROCEDURE P_ANY_EXCEPTION (SQLCODE, ������ ������� ������ …);

END

��������� ����� ����������

�����������, ��� ����� ����������� � ������ �� ������� ������� ��������� �������������� ������, ����� ��� ��� ��������� ���������� ��������� ���� ������ � ��������� ��������� ��� �������. ������� � ������ 1.5, ����� �������� ������� ���������� — �� ������ ��������� ��������� ��������� ���������� � ��������� ���������� ���������� EXCEPTION ��� ����������� ���������� � �������� ���������� �� �������� END. ���������� ���������������, � ���������� ���������� ������� � ����� ��� ������ ���������� � ���������� ���������� � ������� ��������� ������.

� ����� ����������� �� ��������� SQLCODE ��� GDSCODE � ��������� ������ ����������� ����������, ����������� ������ � ��������, � ����� ������ ��������� ����������:

BEGIN

. . .

WHEN ANY DO

BEGIN

EXECUTE PROCEDURE P_ANY_EXCEPTION (SQLCODE, ������ ������� ������ …);

EXCEPTION; END

END ^

Протокол ошибок

Протокол ошибок

Если для вас важно сохранять протокол ошибок, помните, что исключения, возникающие у клиента, приводят к отмене всей работы, выполненной в модуле. Если вы ведете протокол в таблице базы данных, то записи протокола исчезнут вместе с другой отмененной работой. В случаях, когда обработчики исправят или «проглотят» каждую ошибку, внутренняя таблица будет работать просто прекрасно.

Если вам нужен протокол, который будет сохраняться и после необработанного исключения, используйте внешнюю таблицу. Подробности см. в разд. «Использование внешних файлов в качестве таблиц» главы 16.

! ! !

СОВЕТ. В конце этой главы описано применение подобной техники в процедуре, которая добавляет строки во внешнюю таблицу, хотя последняя не является таблицей протоколирования ошибок.

. ! .

SQLCODE и GDSCODE

В версии 1.5 и выше вы можете перехватить числовой код ошибки, который передается внутренне определенному исключению в контекстной переменной SQLCODE или GDSCODE. Это предоставляет весьма компактный способ протоколирования текущего исключения в виде фрагмента вашей подпрограммы обработки исключений.

Внутренне определенные исключения имеют и SQLCODE, и GDSCODE. Ваш код может обратиться только к одному коду, другой будет недоступен.

! ! !

ПРИМЕЧАНИЕ. Каждый раз, когда вы попытаетесь обратиться к этим кодам вне блока обработчика, вы получите ноль.

. ! .

Следующая структура блока кода завершается группой обработчиков исключений. Первые два обрабатывают ошибки SQLCODE в виде пользовательских исключений. Эти пользовательские исключения могут быть обработаны во внешнем блоке или их назначением может быть аварийное завершение процедуры и возврат клиенту полезного сообщения.

Если не появилось ни одного из предусмотренных исключений, а было некоторое другое, то его перехватит оператор WHEN ANY. Его обработчик вызывает хранимую процедуру для вывода записи протокола, передавая код SQLCODE вместе с другими входными аргументами, полученными из контекста блока:

BEGIN

. . .

WHEN SQLCODE -802 DO

EXCEPTION E_EXCEPTION_1;

WHEN SQLCODE -803 DO

EXCEPTION E_EXCEPTION_2;

WHEN ANY DO

EXECUTE PROCEDURE P_ANY_EXCEPTION (SQLCODE, другие входные данные …);

END

Повторный вызов исключения

Предположим, вам нужно перехватить и внести во внешнюю таблицу протокола непредвиденную ошибку, перед тем как позволить исключению выполнить свою работу и завершить процедуру или триггер. Начиная с версии 1.5, можно повторно вызвать исключение — вы можете выполнить некоторую обработку исключения и завершить обработчик оператором EXCEPTION для возбуждения исключения и передачи управления на конечный END. Выполнение останавливается, и управление передается клиенту с кодом или именем исключения и подходящим сообщением в массиве состояния ошибки.

В вашем обработчике вы выбираете SQLCODE или GDSCODE и некоторые другие контекстные переменные, записываете запись в протокол, а затем заново вызываете исключение:

BEGIN

. . .

WHEN ANY DO

BEGIN

EXECUTE PROCEDURE P_ANY_EXCEPTION (SQLCODE, другие входные данные …);

EXCEPTION; END

END ^

Читайте также

Протокол IP

Протокол IP
Межсетевой протокол (Internet Protocol, IP) обеспечивает доставку фрагмента данных (датаграммы) от источника к получателю через систему связанных между собой сетей. В протоколе IP отсутствуют функции подтверждения, контроля передачи, сохранения последовательности

Протокол LLC

Протокол LLC
Протокол LLC обеспечивает большую часть услуг уровня канала данных. Этот протокол был разработан на основе другого протокола уровня канала данных — HDLC, однако обладает меньшей функциональностью по сравнению со своим родителем.Формат кадра LLC представлен на

5.3. Протокол SSH

5.3. Протокол SSH
Мы уже говорили о том, что протокол Telnet не очень хорошо подходит для удаленного управления сервером, потому что далеко не безопасен. А желание и потребность в этом есть. В больших сетях, как правило, используются несколько серверов, и бегать от одного

Протокол IPX/SPX

Протокол IPX/SPX
Протоколы IPX и SPX – представители стека протоколов, разработанных компанией Novell, которая в свое время являлась прямым конкурентом компании Microsoft. Конкуренция велась в области сетевых операционных систем: с одной стороны стояла операционная система Novell Netware,

Протокол TCP/IP

Протокол TCP/IP
TCP/IP – самый распространенный протокол транспортного уровня и в локальных, и в глобальных сетях, разработанный Министерством обороны США более 20 лет назад.Протокол TCP/IP имеет открытый интерфейс. Это означает, что вся информация об этом протоколе открыта и

1.7.3. Протокол TCP/IP

1.7.3. Протокол TCP/IP
В этом разделе давайте рассмотрим, как передается информация в TCP/IP-сети. Любая информация передается небольшими порциями, которые называются пакетами. Если нужный объем информации нельзя передать одним пакетом, он разбивается на части. В заголовке

5.24 Протокол ARP

5.24 Протокол ARP
Перед тем как датаграмма будет передана с одной системы локальной сети на другую, она будет обрамлена заголовком и завершающей частью кадра. Кадр доставляется на сетевой адаптер, физический адрес которого совпадает с физическим адресом назначения из

8.9 Протокол RIP

8.9 Протокол RIP
Наиболее широко используемым протоколом IGP является RIP, заимствованный из протокола маршрутизации сетевой системы компании Xerox (Xerox Network System — XNS). Популярность RIP основана на его простоте и доступности.RIP был первоначально реализован в TCP/IP операционной

8.17 Протокол BGP

8.17 Протокол BGP
В Интернете широко используется протокол граничного шлюза (Border Gateway Protocol — BGP). Текущей версией протокола является BGP-4.В современном Интернете существует множество провайдеров, объединенных между собой на манер сети межсоединений. При движении к точке

14.6 Протокол FTP

14.6 Протокол FTP
С протоколом FTP связаны следующие понятия:? Команды и их параметры, пересылаемые по управляющему соединению? Числовые коды, возвращенные в ответ на команду? Формат пересылаемых данныхНиже рассмотрен набор команд FTP. Они передаются по управляющему

15.17 Протокол NFS

15.17 Протокол NFS
Последней реализацией NFS является версия 3, хотя продолжают успешно применяться реализации версии 2. Программа NFS сервера имеет номер 100003 и, по соглашению, NFS захватывает при инициализации порт

16.14 Протокол POP

16.14 Протокол POP
Протокол почтового офиса (Post Office Protocol — POP) применяется для пересылки сообщений с почтового сервера на настольную или переносную компьютерную систему.Спецификация POP определяет множество различных функций, например возможность просмотра списка

27.1. Протокол TCP/IP

27.1. Протокол TCP/IP

27.1.1. Многоуровневая архитектура стека TCP/IP
Протокол TCP/IP был создан в конце 60-х — начале 70-х годов агентством DARPA Министерства Обороны США (U.S. Department of Defense Advanced Research Projects Agency). Основные этапы развития этого протокола отмечены в таблице 27.1.Этапы развития

2.1.5. Протокол UDP

2.1.5. Протокол UDP
Протокол UDP (User Datagram Protocol — протокол пользовательских дейтаграмм) встречается реже, чем его «одноклассник» TCP, но он проще для понимания, поэтому мы начнем изучение транспортных протоколов с него. Коротко UDP можно описать как ненадежный протокол без

29.2. Протокол cgi

29.2. Протокол cgi
Аббревиатура cgi обозначает спецификацию, которая задает для получающих информацию сценариев способ обмена данными с сервером. Подобные сценарии (или сценарии cgi) могут быть созданы с помощью любого языка написания сценариев. Наиболее популярным является

obo.dev

Протоколы ошибок

В Swift есть несколько протоколов по обработке ошибок.

Основной

  • Error

Специализированные

  • LocalizedError
  • RecoverableError
  • CustomNSError

Протокол ошибок (Protocol Error)

Тип данных, представляющий значение ошибки, которое может быть выброшено.

Это встроенный протокол, который объявлен как:

Любой тип, декларирующий соответствие протоколу Error, может использоваться для представления ошибки в системе обработки ошибок Swift. Поскольку у протокола Error нет собственных требований, то можно заявить о соответствии для любого пользовательского типа, который создаете.

Использование перечислений в качестве ошибок

Перечисления Swift хорошо подходят для представления простых ошибок.

Для этого необходимо создать перечисление, которое соответствует протоколу Error. В перечислении следует описать случаи для каждой возможной ошибки. Если есть дополнительные сведения об ошибке, которые могут быть полезны для решения проблемы с ошибкой, то следует использовать связанные значения (associated values), чтобы включить эту информацию.

В следующем примере показано перечисление IntParsingError, которое фиксирует два разных типа ошибок, которые могут возникнуть при синтаксическом анализе целого числа из строки:

  • переполнение, когда значение, представленное строкой, слишком велико для целочисленного типа данных,
  • недопустимый ввод, когда нечисловые символы находятся на входе.
enum IntParsingError: Error {
    case overflow
    case invalidInput(Character)
}

В этом примере случай invalidInput включает недопустимый символ в качестве связанного значения.

В следующем примере кода показано возможное расширение типа Int, которое анализирует целочисленное значение экземпляра String и выдает ошибку при возникновении проблемы во время анализа.

extension Int {
    init(validating input: String) throws {
        // ...
        let c = _nextCharacter(from: input)
        if !_isValid(c) {
            throw IntParsingError.invalidInput(c)
        }
        // ...
    }
}

При вызове новой инициализации Int в операторе do можно использовать сопоставление с шаблоном, чтобы сопоставить конкретные случаи пользовательского типа ошибки и получить доступ к их связанным значениям, как в примере ниже.

do {
    let price = try Int(validating: "$100")
} catch IntParsingError.invalidInput(let invalid) {
    print("Invalid character: '(invalid)'")
} catch IntParsingError.overflow {
    print("Overflow error")
} catch {
    print("Other error")
}

// Output
// Invalid character: '$'

Включение дополнительных данных в ошибки

Иногда необходимо, чтобы разные состояния ошибок включали одни и те же общие данные, такие как позиция в файле или некоторые состояния вашего приложения. После того как вы это сделаете, используйте структуру для представления ошибок.

В следующем примере используется структура для представления ошибки при синтаксическом анализе XML-документа, включая номера строк и столбцов, в которых произошла ошибка:

do {
    let price = try Int(validating: "$100")
} catch IntParsingError.invalidInput(let invalid) {
    print("Invalid character: '(invalid)'")
} catch IntParsingError.overflow {
    print("Overflow error")
} catch {
    print("Other error")
}

// Output
// Invalid character: '$'

Еще раз используйте сопоставление с образцом для условного отлова ошибок. Вот как вы можете перехватывать любые XMLParsingError ошибки (синтаксического анализа XML), выдаваемые функцией parse(_:):

do {
    let xmlDoc = try parse(myXMLData)
} catch let e as XMLParsingError {
    print("Parsing error: (e.kind) [(e.line):(e.column)]")
} catch {
    print("Other error: (error)")
}

// Output
// Parsing error: mismatchedTag [19:5]

В этом протоколе есть такое свойство localizedDescription, которое позволяет получить локализованное описание ошибки.

Это свойство вычисляемое и объявлено как

var localizedDescription: String { get }

Специализированные протоколы ошибок

Есть несколько специализированных протоколов ошибок, которым перечисление с ошибками может соответствовать. И, вероятно, следует использовать их по сравнению с протоколом ошибок по умолчанию (Error), который предоставляется языком по умолчанию.

Все эти протоколы сами соответствуют протоколу Error.

Ниже будут рассмотрено несколько протоколов, которые можно использовать при работе с ошибками в Swift.

LocalizedError

Протокол LocalizedError предоставляет четыре свойства для отображения пользователю информации об ошибках на его родном языке.

Ниже перечислены четыре свойства, и все они являются строками. Они необходимы, но они обеспечивают реализацию по умолчанию (Required. Default implementation provided.).

  • var errorDescription: String?
  • var failureReason: String?
  • var helpAnchor: String?
  • var recoverySuggestion: String?

Примером реализации может быть:

enum NetworkError: LocalizedError {
	case noNetwork
	case unexpectedResponse

	var errorDescription: String {
		switch self {
			case .noNetwork:
				NSLocalizedString("No network connection found", comment: "")
			case .unexpectedResponse:
				NSLocalizedString("The server returned an unexpected response", comment: "")
		}
	}

	var failureReason: String? {
		switch self {
			case .noNetwork:
				NSLocalizedString("Could not connect to the internet", comment: "")
			case .unexpectedResponse:
				NSLocalizedString("The server is not working properly", comment: "")
		}
	}

	var recoverySuggestion: String? {
		switch self {
			case .noNetwork:
				NSLocalizedString("Check your internet connection and try again", comment: "")
			case .unexpectedResponse:
				NSLocalizedString("Contact support", comment: "")
		}
	}
}

Есть еще одна интересная деталь об этом типе ошибок, а именно то, что при соединении с Objective-C (или преобразовании в NSError — casted as NSError) все свойства протокола получают ключами userInfo словаря NSError:

  • NSLocalizedDescriptionKey для errorDescription
  • NSLocalizedFailureReasonErrorKey для failureReason
  • NSLocalizedRecoverySuggestionErrorKey для recoverySuggestion
  • NSHelpAnchorErrorKey для helpAnchor

Так что, если необходимо, чтобы ваши ошибки были связаны с Objective-C, это одна из специализаций, которую следует учитывать.

RecoverableError

Протокол RecoverableError предоставляет средства, которые помогут вашим пользователям попытаться восстановиться после ошибок. Эта специализация предоставляет одно свойство и два метода:

  • var recoveryOptions: [String]: это массив строк, которые можно показать своему пользователю при попытке восстановления после ошибок. Это свойство является обязательным и не предоставляется реализация по умолчанию (Required);
  • func attemptRecovery(optionIndex: Int) -> Bool: используйте это, чтобы попытаться восстановиться после ошибки, а затем верните логическое значение, указывающее, была ли операция успешной или нет. optionIndex соответствует индексу опции в массиве recoveryOptions. Этот метод обязательный и не предоставляется реализация по умолчанию (Required);
  • func attemptRecovery(optionIndex: Int, resultHandler: (Bool) -> Void): как и в предыдущем методе, используйте этот метод, чтобы попытаться исправить ошибку. Разница в том, что используется замыкание для передачи результата восстановления, поэтому вы можете использовать его, когда необходимо попытаться восстановить используя асинхронные операции. Этот метод обязательный и предоставляется реализация по умолчанию (Required. Default implementation provided).

Быстрый пример реализации:

enum NetworkError: RecoverableError {
	case noNetwork
	case unexpectedResponse

	var recoveryOptions: [String] {
		switch self {
			case .noNetwork:
				return [
					NSLocalizedString("Retry", comment: ""),
					NSLocalizedString("Open Settings to Change Network", comment: "")
				]

			case .unexpectedResponse:
				return [
					NSLocalizedString("E-Mail support", comment: ""),
					NSLocalizedString("Change server", comment: "")
				]
		}
	}

	func attemptRecovery(optionIndex recoveryOptionIndex: Int) -> Bool {
		switch self {
			case .unexpectedResponse:
				if recoveryOptionIndex == 0 {
					// Mail support
				} else if recoveryOptionIndex == 1 {
					// Change server
				}
				return true
			default:
				return false
		}
	}

	// ...
}

Опять же, к свойствам можно получить доступ через userInfo NSError, используя NSLocalizedRecoveryOptionsErrorKey для recoveryOptions и ключ NSRecoveryAttempterErrorKey для доступа к параметрам восстановления.

CustomNSError

Наконец, протокол CustomNSError предоставляет свойства для создания хорошо известного объекта NSError с доменом ошибки , кодом ошибки и информацией о пользователе. Все свойства являются обязательными, но предоставляется реализация по умолчанию для каждого (Required. Default implementation provided.):

  • static var errorDomain: String: это домен ошибки в обратной нотации DNS.
  • var errorCode: Int: код ошибки в виде Int.
  • var errorUserInfo: [String : Any]: в виде словаря [String: Any].

Быстрый пример реализации:

enum NetworkError: CustomNSError {
	enum ErrorCode: Int {
		case noNetwork
		case unexpectedResponse
	}

	var errorDomain = "com.andyibanez.com.myApp.NetworkError"
	var appErrorCode: ErrorCode

	var errorCode: Int {
		return self.appErrorCode.rawValue
	}

	var errorUserInfo: [String : Any] {
		let dic = [
			"URL": //...,
		]
	}
}

Поскольку вы сами предоставляете userInfo, то вам не нужно беспокоиться о том, какие у него ключи. Он обладает большой гибкостью, но с ним сложнее работать.

Смешивание несколько протоколов вместе

Помните, что это протоколы, и вам разрешено соответствовать более чем одному протоколу одновременно. Поэтому ничто не мешает вам, скажем, создать исправимую локализованную ошибку.

Пример:

enum NetworkError: LocalizedError, RecoverableError {
	case noNetwork
	case unexpectedResponse

	// MARK: - LocalizedError

	var localizedDescription: String {
		switch self {
			case .noNetwork:
				return NSLocalizedString("No network connection found", comment: "")
			case .unexpectedResponse:
				return NSLocalizedString("The server returned an unexpected response", comment: "")
		}
	}

	var failureReason: String? {
		switch self {
			case .noNetwork:
				return NSLocalizedString("Could not connect to the internet", comment: "")
			case .unexpectedResponse:
				return NSLocalizedString("The server is not working properly", comment: "")
		}
	}

	// MARK: - RecoverableError

	var recoverySuggestion: String? {
		switch self {
			case .noNetwork:
				return NSLocalizedString("Check your internet connection and try again", comment: "")
			case .unexpectedResponse:
				return NSLocalizedString("Contact support", comment: "")
		}
	}

	var recoveryOptions: [String] {
		switch self {
			case .noNetwork:
				return [
					NSLocalizedString("Retry", comment: ""),
					NSLocalizedString("Open Settings to Change Network", comment: "")
				]

			case .unexpectedResponse:
				return [
					NSLocalizedString("E-Mail support", comment: ""),
					NSLocalizedString("Change server", comment: "")
				]
		}
	}

	func attemptRecovery(optionIndex recoveryOptionIndex: Int) -> Bool {
		switch self {
			case .unexpectedResponse:
				if recoveryOptionIndex == 0 {
					// Mail support
				} else if recoveryOptionIndex == 1 {
					// Change server
				}
				return true
			default:
				return false
		}
	}
}

Вывод

Обработка ошибок в Swift становится проще, когда использовать эти протоколы ошибок. Они могут сильно помочь в написании лучшего кода обработки ошибок, который работает во всей платформе Foundation и в остальных API.


Еще полезные ссылки

  • Опционалы
  • Управление потоком
  • Функции
  • Перечисления
  • Протоколы
  • Передача и обработка ошибок

Также информацию по протоколам ошибок можно получить на странице официальной документации.

Ссылки на официальную документацию:

  • Apple Developer Documentation — Error
  • Apple Developer Documentation — LocalizedError
  • Apple Developer Documentation — RecoverableError
  • Apple Developer Documentation — CustomNSError

Электронное декларирование

  • заказать дополнительный логин
  • редактировать сведения о компании
  • заказать пакет деклараций

Войти

Электронная подпись

  • выпустить (перевыпустить) ЭП
  • аннулировать ЭП
  • изменить контакты и реквизиты

Войти

СВД-сервер

  • статистика обмена с таможенными органами
  • детализация процесса электронного декларирования
  • проверка и пополнение баланса
    договора на ЭД, СМС информирование

Войти

Онлайн-сервисы

  • Поиск вагонов, Такса, ЖД-Тариф, Груз на СВХ, подключение и настройки API
  • баланс договора онлайн-сервисов
  • заказы и комментарии на сайте

Войти

Таможенный
форум

  • обсуждение вопросов декларирования с опытными декларантами и экспертами ВЭД
  • вопросы и предложения к технической поддержке компании
  • общение на таможенную тематику

Войти

Возможно, вам также будет интересно:

  • Что такое протокол коррекции ошибок
  • Что такое произошла ошибка sql
  • Что такое произошла ошибка транзакции
  • Что такое произошла ошибка dns
  • Что такое произошла ошибка сети

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии