Changes between Initial Version and Version 1 of plans_for_lect2


Ignore:
Timestamp:
02/29/16 21:47:16 (8 years ago)
Author:
Evgeny Linsky
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • plans_for_lect2

    v1 v1  
     1{{{
     21. Виды ошибок в runtime
     3
     4    - ошибки по вине программиста
     5   
     6        int a[10];
     7        for(int i = 0; i <= 10; i++) {
     8            a[i] = i;
     9        }
     10
     11        char s;
     12        strlen(s);
     13
     14    - ошибки по вине окружения
     15        пользователь ввел неправильные данные
     16        на диске закончилось место
     17        разорвалось сетевое соединение
     18
     192. Ошибки по вине программиста
     20    - выявить ошибки на стадии отладкиж
     21        assert(s != NULL), gcc -DNDEBUG
     22        автотесты (google test)
     23
     243. Ошибки по вине окружения
     25    - предусмотреть обработку ошибок
     26        вывод сообщения об ошибке
     27        освободить ресурсы (динамическая память, открытые файлы, ...)
     28        поптыка восстановления (например, использование параметров по умолчанию вместо данных некорректного конфига)
     29
     304. С style
     31   
     32    FILE* fin = fopen("a.txt", "r"); //одно из возвращаемых значений зарезервировано
     33    if( fin == NULL ) {
     34        // возможные причины: нет файла; нет прав; ...
     35        printf("s\n", strerror(errno));  //errno --- глобальная переменная (код последней ошибки)
     36    }
     37
     38
     39    Недостатки:
     40    - не всегда возможно зарезервировать значение под ошибку: atoi("0") == atoi("abbc")
     41    - недостаточно информации об ошибки: код, текстовое сообщение, имя функции и т.д.
     42    - перемещана логика работы и логика обработки ошибки
     43
     44        int res1 = robot.up();
     45        if( res1 < 0 ){
     46            //обработка
     47        }
     48        else {
     49            int res2 = robot.down();
     50            if( res2 < 0) {
     51                //обработка
     52            }
     53        }
     54
     555. C++ style
     56    - try/catch/throw
     57
     58    View::initModel --> Model::init --> Config::load
     59
     60    void Config::load(...) {
     61        if (ошибка формата) {
     62            throw FileException("Bad config format"); //бросить можно значение любого типа
     63        }
     64    }
     65
     66    void Model:init(...) {
     67        try { 
     68            // блок логики работы
     69            Config c;
     70            c.load(this);
     71            initMonsters();
     72            initHeroes();
     73        }
     74        catch(FileException& e) {
     75            // блок обработки ошибок
     76            setDefaultValues();
     77            // здесь нельзя вывести сообщение об ошибке,  т.к. неизвестно,
     78            // какой тип View текстовый или графический => передать ошибку дальше
     79            throw e;
     80        }
     81    }
     82
     83    void View::initModel(...) {
     84        try {
     85            model.init();
     86            createStartScreen();
     87        }
     88        catch(FileException& e) {
     89            showMessageBox(e.message());
     90        }
     91    }
     92
     936. Детали
     94    - поймать и пробросить ошибку любого типа
     95        try {
     96            doSomething()
     97        }
     98        catch(...) {
     99            throw;
     100        }
     101
     102    - stack unwinding
     103        f() {
     104            try {
     105                g();
     106            }
     107            catch(MyException& e) {
     108
     109            }
     110        }
     111
     112        g() {
     113            h();
     114        }
     115
     116        h() {
     117            throw MyException();
     118        }
     119
     120    - сработает первый подходящий catch (порядок важен)
     121        class BaseException { };
     122        class DerivedException : public class BaseException { };
     123
     124        try {
     125
     126        }
     127        catch(DerivedException& de) {
     128
     129        }
     130        cacth(BaseException& be) {
     131
     132        }
     133}}}