Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

try vs return в обработке ошибок - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Скомпилировать проект на Theards http://www.cyberforum.ru/cpp-beginners/thread699009.html
Ребят, очень нужна помощь в компиляции проекта на theards на С++. Хочу разобраться в работе с нитями. Нашла удачный пример работы с потоками, пытаюсь его запустить, но при компиляции ошибки. Ранее...
C++ Передача консольных команд в CMD через system(""); Всем привет! Подскажите как выполнять консольные команды через system с правами администратора? На пример: int main(void) { system("sc create MyService binpath= d:\\myservice.exe typy= own... http://www.cyberforum.ru/cpp-beginners/thread698999.html
C++ Перевод с Fortran на С++
Доброго времени суток. Проблема в следующем, никак не могу разобраться с синтаксисом Fortran. В свое время изучал С++, и то правда давно дело было. Есть код программы на Fortran, не могли бы Вы...
Дописать "рубль" в правильной форме C++
Написать программу которая после введенного с клавиатуры числа ( в диапазоне от 1 до 999), обозначающего денежную единицу,дописывает "рубль" в правильной форме. Например,12 рублей,21 рубль. ...
C++ Составить блок-схему по коду http://www.cyberforum.ru/cpp-beginners/thread698972.html
напишите пожалуйста блок схему для этого кода #include "stdafx.h" #include "iostream" #include "conio.h" #include "string" using namespace std; struct RockGroup{ string name; int age;
C++ Разсчитать значение функций Доброго времени суток. Прошу вашей помощи. Необходимо написать программу, которая разсчитывает значение ф-ции y=cos5x, период для Х , шаг 0.01 и разсчитывает среднее значение всех значений ф-ции при... подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.11.2012, 02:20
Это давний срач: коды возврата vs исключения.

Основное принципиальное отличие: поведение по умолчанию (если не писать дополнительного кода). Коды возврата по умолчанию игнорируются, исключения по умолчанию пробрасываются дальше. Детектор: если вы пишете кодами возврата и у вас довольно часто встречается что-то вида
C
1
2
3
4
err = doSomething();
if (!err) {
    return err; // или goto error_handling, где обработка / return err;
}
то подумайте над переходом к исключениям.

И наоборот, если у вас большая часть "опасных" мест завёрнута в try-блоки и в основном исключения не перебрасываются наверх или тупо игнорируется, то подумайте над переходом к кодам возврата.

Сферическая скорость в вакууме исключений — я думаю, не медленее if (err) { return err; }. Пробежаться по стеку при пробросе наверх в любом случае придётся. Ну и помните: исключения для исключительных ситуаций. Не для штатных и ожидаемых ошибок, а для чего-то, что ставит под угрозу всю дальнейшую работу, так что скорость их работы не является критичной.

Добавлено через 47 минут
Проверил на тупом синтетическом примере
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <ctime>
#include <iostream>
#include <cmath>
 
const int NUM = 10000;
int SLOW;
 
int fail1(int i)
{
    {   double x = 1.0;
        for (int j = 1; j < SLOW; ++j) {
            for (int k = 1; k < SLOW; ++k) {
                x *= j;
                x *= k;
                x = sqrt(x);
            }
        }
    }
    if (i == 0) {
        return 1;
    }
    int err;
    err = fail1(i - 1);
    if (!err) {
        return err;
    }
    return 0;
}
 
int fail2(int i)
{
    {   double x = 1.0;
        for (int j = 1; j < SLOW; ++j) {
            for (int k = 1; k < SLOW; ++k) {
                x *= j;
                x *= k;
                x = sqrt(x);
            }
        }
    }
    if (i == 0) {
        throw 1;
    }
    return fail2(i - 1);
}
 
int main()
{
    clock_t start, end;
    for (int i = 1; i < 30; ++i) {
        SLOW = i;        
        start = clock();
        fail1(NUM);
        end = clock();
        std::cout << (end - start) << ",";
 
        start = clock();
        try {
            fail2(NUM);
        }
        catch(const int &v) {
            // empty
        }
        end = clock();
        std::cout << (end - start) << "\n";
    }
}
У меня при -O0 исключения раз в 20 тормознутее. -O1 — на ~10% тормознутее. -O2/-O3 — идут вровень с кодами возврата
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru