Обработка исключений Основы метапрограммирования презентация

Содержание

Способы обработки ошибок Игнорировать Выводить сообщение Возвращать bool Возвращать int Assert Try/Catch

Слайд 1Обработка исключений
Основы метапрограммирования


Слайд 2Способы обработки ошибок
Игнорировать
Выводить сообщение
Возвращать bool
Возвращать int
Assert
Try/Catch


Слайд 3#include


int x=0, y=0;
std::cin >> x >> y;

assert(y != 0);

int z

= x / y;

Assert (c-style)


Слайд 4void f1() {/* тут могут возникнуть ошибки */}
void f2() {/* тут

могут возникнуть ошибки */}
void f3() {/* тут могут возникнуть ошибки */}

int main()
{
f1();
f2();
f3();

// >>> Как обработать все ошибки здесь? <<<

return 0;
}

Недостатки


Слайд 5Система обработки исключительных ситуаций:

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

ошибки не в том месте, где они возникли
не предполагает дальнейшее выполнение программы

try
{
// код, где возможно исключение
}
catch(std::exception& ex)
{
// обработчик исключения
}

Try/Catch


Слайд 6try
{
double* p = new double[2000000000];
}
catch(const std::bad_alloc& ex)
{
std::cerr

new double[2000000000];
}
catch(std::bad_alloc)
{

}

Bad_alloc


Слайд 7exception
logic_error
runtime_error
length_error
domain_error
out_of_range
invalid_argument
bad_alloc
bad_exception
io_base::failure
bad_typeid
bad_cast
range_error
overflow_error
underflow_error
Стандартные классы исключений


Слайд 8try
{
if (y == 0) throw std::string("Деление на ноль!");
z = x /

y;
}
catch(const std::string& ex)
{
std::cerr << ex;
}

Выбрасывание исключения (throw)

Вариант 1: использовать простой тип


Слайд 9try
{
if (y == 0) throw std::exception("Деление на ноль!");
z = x /

y;
}
catch(std::exception& ex)
{
std::cerr << ex.what();
}

Вариант 2: класс std::exception


Слайд 10
class ExceptionDivideByZero : public std::exception
{
};


try
{
if (y == 0) throw ExceptionDivideByZero();
z =

x / y;
}
catch(ExceptionDivideByZero)
{
std::cerr << "Деление на ноль!";
}

Вариант 3: собственный класс


Слайд 11Catch all
try
{

}
catch(...)
{
std::cerr


Слайд 12Catch-цепочка
try
{


}
catch(std::bad_alloc)
{
}
catch(std::bad_cast)
{
}


Слайд 13try
{

}
catch(std::exception)
{
}
catch(...)
{
}
catch(std::bad_alloc)
{
}


// ОШИБКА


Слайд 14try
{

}
catch(std::bad_alloc)
{
}
catch(std::exception)
{
}
catch(...)
{
}


// ВЕРНО


Слайд 15Повторное выбрасывание исключения
try
{
try
{
// Здесь произошла ошибка выделения памяти
}
catch(std::bad_alloc)
{
// Выдаем сообщение, и

перевыбрасываем:
throw;
}
}
catch(std::exception)
{
// Заносим в лог
}

Слайд 16Конструктор
При выбросе исключения в конструкторе процесс конструирования экземпляра
класса прерывается и

он считается не созданным.
Деструктор для такого класса вызван не будет.
Будут вызваны деструкторы для тех полей класса, для которых успели выполниться
конструкторы.

Деструктор
Деструкторы не должны возвращать исключений. Если в деструкторе возникает
исключение, оно должно быть обработано в нем же.

Слайд 17class B
{
public:
B() { std::cout

std::cout << "2"; }
};

class C
{
B b;
public:
C() { throw 0; std::cout << "3"; }
~C() { std::cout << "4"; }
};
------------------------
try
{
C c;
}
catch(...)
{
}

Слайд 18Существует 2 разновидности шаблонов:
Шаблоны функций.
Шаблоны классов.
Простое понимание: шаблоны – это

универсальные классы и функции,
которые работают для любого типа данных.

Глубокое понимание: шаблон — это указания компилятору правил по
созданию классов во время компиляции. Иными словами, это код, результатом
компиляции которого является другой код.

Шаблоны


Слайд 19Шаблоны функций.
Шаблон функции – обобщенная функция, определяющая некую универсальную совокупность операций.
int

min ( int a, int b )
{
return (a < b ? a : b);
}



Слайд 20int min ( int a, int b )
{

return (a < b ? a : b);
}


float min ( float a, float b )
{
return (a < b ? a : b);
}


double min ( double a, double b )
{
return (a < b ? a : b);
}



Слайд 21template
T Min (T a, T b)
{

return ( a < b ? a : b );
}


int minXY = Min (3, 5);

int minXY = Min (3.0, 5.0);



Слайд 22 int x=1,y=3;
Swap(x, y); //

конкретизация для int
std::сout << x << " " << y << std::endl;

template
void Swap(const T & a, const T & b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}

Шаблонная функция обмена
2-х значений.



Слайд 23template
T Sum (const T & one, const T

& two)
{
return (one + two);
}


Sum(10, 20.0); //ОШИБКА

1) Типовое соответствие

Синтаксические правила


0) Объявление и реализация в h-файле


Слайд 24template
void f (T1 a, T2 b)
{

……
}

2) Используемые в заголовке функции типы должны присутствовать в
заголовке шаблона.



Слайд 25template
void f (T1 a)
{
……..
}
3)

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


f(1);


Слайд 26Явная конкретизация типа
template
T Sum(T left, T right)
{
return

(left + right);
}

void main()
{
char x = 1, y = 2;
//std::cout << Sum(x,y); //будет выведен символ

std::cout << Sum (x,y); //char преобразуется в int
}



Слайд 27template
T & Max (const T & a, const

T & b)
{
return ( a > b ? a : b );
}

const char * Max (const char *strA, const char * strB)
{
return ( strcmp (strA, strB) >= 0 ? strA : strB );
}


std::cout << Max (1, 5) << std::endl;
std::cout << Max («aa», «ba») << std::endl;

Специализация шаблонной функции

Реализация шаблонной функции для конкретного типа замещает,
маскирует шаблон (для этого типа).



Слайд 28Алгоритм разрешения ссылки при вызове функции:
1) найти функцию с точно такими

параметрами.
2) если нет - найти шаблонную, порождение которой точно
соответствует по параметрам.
3) если нет – поиск обычной, параметры которой можно преобразовать.

Слайд 29Шаблоны классов
- Шаблон класса описывается подобно обычному классу, но имеет
типовой

параметр, уточнение которого происходит на стадии
компиляции (инстанцирование).

- Это позволяет создавать универсальные структуры данных (массив, список,
очередь, стек,....) и реализовывать универсальные алгоритмы работы с ними.

- Одно из применений данной возможности в классе – хранение и
обработка объектов любого типа.

Такие классы называются контейнерами.

Шаблон класса – это некое общее описание класса, на основе которого
создаются его версии для различных типов данных.


Слайд 30template
class vector
{
T* data;

public:

vector();
~vector();

T & operator [] (int index);
};

Шаблон массива

vector vec;

for(int i=0; i<10; i++) a[i] = i+1;



Слайд 31template
class vector
{
T data [Size];

public:

vector();
T & operator [] ( int index );
};

Нетиповые параметры шаблона

Шаблон одномерного статического массива. Размер – параметр шаблона.



Слайд 32template
vector :: vector()
{
for(int n=0;

n < Size; n++)
data[n] = T();
}

template
T & vector ::operator [] ( int index )
{
return data[index];
}



Слайд 33vector vecNumbers; //конкретизация для

int

vector vecTimes; //конкретизация для класса



Слайд 34template
class vector
{
T * data;
public:
vector (int

size);
~vector();
};

template
vector :: vector (int size)
{
data = new T [size];
for(int i=0; i < size; i++)
data[n] = T();
}

Параметры конструктора

vector vec (100);



Слайд 35template
class Stack
{
T data [Size];

int top;
public:
Stack();
void Push(T item);
T Pop();
};

Шаблон класса стека



Слайд 36template
Stack ::Stack()
{
top = 0;
}

template

T, int Size>
void Stack ::Push(T item)
{
if(top >= Size)
{
assert(false);
}

data [top++] = item;
}


template
T Stack::Pop()
{
if(top <= 0)
{
assert(false);
}

return data[--top];
}



Слайд 37....
Stack st;
for(int i=0; i

i++)
std::cout << st.Pop() << " ";
.....

9 8 7 6 5 4 3 2 1 0



Слайд 38Специализация шаблонов (полная)
template //универсальный шаблон
class vector
{
T* values;

public:

vector();
};


template <>
class vector //шаблон для типа int
{
int* values;

public:
vector();
};



Слайд 39template
int Fact()
{
return n * Fact();
}

template

<>
int Fact<0>()
{
return 1;
}

int main()
{
int f = Fact <5>();

return 0;
}

Шаблон рекурсивного вычисления факториала


Слайд 40template
struct COMPILE_ASSERT_STRUCT
{
};

template
struct COMPILE_ASSERT_STRUCT
{
virtual void dummy() = 0;
};

#define

COMPILE_ASSERT(cond) COMPILE_ASSERT_STRUCT();



void main()
{
const int x = 1;

COMPILE_ASSERT(x > 0);
}

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика