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

Содержание

Слайд 2

Nortel Networks Confidential

Software Errors
(классические ошибки программирования)
Run-Time Errors
(ошибки связанные с нехваткой или

Nortel Networks Confidential Software Errors (классические ошибки программирования) Run-Time Errors (ошибки связанные
недоступностью ресурсов ОС)

Типы ошибок

Слайд 3

Nortel Networks Confidential

прекратить выполнение
возвратить значение «ошибка»
возвратить допустимое значение и оставить программу в

Nortel Networks Confidential прекратить выполнение возвратить значение «ошибка» возвратить допустимое значение и
ненормальном состоянии
вызвать функцию обработки ошибок

Традиционные техники

Слайд 4

Nortel Networks Confidential

Вариант 1. Прекратить выполнение.

#include ;
char Stack::pop()
{
assert( top != 0

Nortel Networks Confidential Вариант 1. Прекратить выполнение. #include ; char Stack::pop() {
);
return store[--top];
}

#ifdef NDEBUG
#define assert(exp)
#else
#define assert(exp)
((exp) ? 0 : __assert_fail(__STRING(expr),
__FILE__,
__LINE__))
#endif

Слайд 5

Nortel Networks Confidential

Результат работы assert

stack_assert: simple_stack.cpp:61:
char Stack::pop (): Assertion ‘top != 0’

Nortel Networks Confidential Результат работы assert stack_assert: simple_stack.cpp:61: char Stack::pop (): Assertion
failed.
Abort (core dumped)

(gdb) where
#0 0x400b8b01 in __kill () from /lib/i686/libc.so.6
#1 0x400b88da in raise (sig=6) at ../sysdeps/posix/raise.c:27
#2 0x400ba082 in abort () at ../sysdeps/generic/abort.c:88
#3 0x400b2220 in __assert_fail () at assert.c:74
#4 0x0804a22d in Stack::pop ()
#5 0x0804a49a in Stack_Interface::pop_and_print_char ()
#6 0x0804a713 in main ()
#7 0x400a6647 in __libc_start_main (main=0x804a59c

, argc=1,

Слайд 6

Nortel Networks Confidential

Вариант 2. Возвратить «ошибку».

char Stack::pop() {
return top ? store[--top]

Nortel Networks Confidential Вариант 2. Возвратить «ошибку». char Stack::pop() { return top
: 0;
}

enum tRC {
OK,
BAD_SIZE,
OVERFLOW,
UNDERFLOW
};

tRC Stack::pop(char* c)
{
if (!top) return UNDERFLOW;
*c=store[--top];
return OK;
}

char Stack::pop(tRC* rc) {
if (top) {
*rc=OK;
return store[--top];
}
*rc=UNDERFLOW;
return 0;
}

Слайд 7

Nortel Networks Confidential

Вариант 2. Возвратить «ошибку».

Может не быть подходящего значения
Результат каждого вызова

Nortel Networks Confidential Вариант 2. Возвратить «ошибку». Может не быть подходящего значения
должен проверяться на «ошибку»

Слайд 8

Nortel Networks Confidential

Вариант 3. Оставить программу в ненормальном состоянии.

// error_handle.h
enum tError {

Nortel Networks Confidential Вариант 3. Оставить программу в ненормальном состоянии. // error_handle.h
OK,
BAD_SIZE,
OVERFLOW,
UNDERFLOW,
...
} g_Error;

// stack.cpp
#include “error_handle.h”
char Stack::pop() {
if (top!=0) {
return store[--top];
}
g_Error=UNDERFLOW;
return 0;
}

// stack.h
class Stack {
Stack();
~Stack();
void push(char);
char pop();
// ...
};

Слайд 9

Nortel Networks Confidential

Вариант 3. Оставить программу в ненормальном состоянии.

Вызывающая функция может не

Nortel Networks Confidential Вариант 3. Оставить программу в ненормальном состоянии. Вызывающая функция
заметить ненормального состояния

#include “stack.h”
#include “error_handle.h”
int main()
{
Stack stack;
char c = stack.pop();
if (g_Error != OK) {
// error occured
}
else {
// OK
}
}

Слайд 10

Nortel Networks Confidential

Вариант 4. Вызвать функцию обработки ошибок.

У функции обработки ошибок есть

Nortel Networks Confidential Вариант 4. Вызвать функцию обработки ошибок. У функции обработки
только три первые альтернативы, как обрабатывать ошибку

void* new (size_t size)
{
for(;;)
{
if (void* p = malloc(size))
return p;
if (!find_memory_somewhere())
return 0;
}
}

Имя файла: Обработка-ошибок.pptx
Количество просмотров: 147
Количество скачиваний: 0