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

try - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.03.2010, 07:33     try #1
Пользоваться tryем, представьте себе, начинаю. Может ли обработчик исключения получить указатель на его источник (функцию/операцию, в которой произошло исключение) или иную информацию о месте возникновения исключения? Можно ли в заголовке cathа указать два типа (для обработки исключений, возникающих в операциях с операндами разных типов)? Какие исключения отбрасывать throwем и что вернуть вторым returnом в коде
C++
1
2
3
4
5
6
7
8
9
double & operator [] (int i)
{
 if (i<number)
 {
  return Data[i];
 }
 throw ...;
 return ...;
}
оператора индексации ограниченного массива?

Добавлено через 19 минут
При каких операциях возникают исключения типов:
C++
1
2
3
4
5
6
7
8
int
float
double
char
int *
float *
double *
char *
?

Добавлено через 9 минут
Каков смысл операнда i в заголовке обработчика исключения в коде
C++
1
2
3
4
5
6
7
int n;
try
{
}
catch (int i)
{
}
? То есть что туда передаётся, если исключение получено не путём исполнения кода
C++
1
throw n;
?

Добавлено через 6 минут
Как должен быть объявлен
C++
1
DevideByZeroExeption
?

Добавлено через 1 час 25 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
try
{
 double *a;
 cout<<1;
 a=NULL;
 *a=4.1;
 cout<<2;
}
cath (...)
{
 cout<<"Error";
}
нифига не выводит.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.03.2010, 10:20     try #2
1.
C++
1
2
3
4
5
6
7
8
9
10
double & operator [] (int i)
{
    if (i >= 0 && i < number)
    {
        return Data[i];
    }
    throw std::out_of_range("Индекс вне диапазона!");
    // сюда мы никогда не попадем уже! но написать return можно, чтобы компилятор не ругался
    return 0.;
}
2. Зависит от пользовательского кода. Классы библиотеки C++ выбрасывают исключения - наследники std::exception, но не POD-типов.
3. Это аргумент, переданный в вызове соответствующего throw. Можно использовать, например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
int n;
try
{
    // ..
    n = 25;
    throw n;
}
catch (int i)
{
    std::cout << "Возникла ошибка с кодом " << n << std::endl;  // будет "Возникла ошибка с кодом 25"
}
3.1. Ничего не передается и этот блок вообще никогда не будет выполняться.
4. и 5. А с какой стати оно должно выводиться? Это Access violation, системное исключение, генерируемое аппаратурой, а не C++-исключение. try/catch перехватывает только C++-исключения, но не системные исключения.
В Windows такие исключения называются SEH-исключениями (читать про них у Рихтера). Можно явно транслировать SEH-исключения в C++-исключения, и тогда такие транслированные исключения будут перехватываться блоками catch.
Смотри функцию _set_se_translator.
Divide by Zero - это тоже SEH-исключение.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.03.2010, 10:31  [ТС]     try #3
Цитата Сообщение от CheshireCat Посмотреть сообщение
return 0.;
Мне же ссылку надо вернуть! Или это пройдёт?

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
/ сюда мы никогда не попадем уже!
Это я знаю.
Цитата Сообщение от CheshireCat Посмотреть сообщение
чтобы компилятор не ругался
Мне и надо компил успокоить.

Добавлено через 4 минуты
Цитата Сообщение от CheshireCat Посмотреть сообщение
3.1. Ничего не передается и этот блок вообще никогда не будет выполняться.
То сть я сам должен сладить за каждым исключением и везде втыкать проверки типа
C++
1
2
3
4
if (!p)
{
 throw p;
}
где p - какойто указатель? А если указатель не NULL, но и не действителен (
C++
1
2
3
4
5
double p1,p2;
p1=new double [100];
p2=p1;
delete [] p1;
*p2=44.0;
) то как проверить?

Добавлено через 1 минуту
Цитата Сообщение от CheshireCat Посмотреть сообщение
Смотри функцию _set_se_translator.
Спасибо. Где?

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
А если указатель не NULL, но и не действителен (
C++
1
2
3
4
5
double p1,p2;
p1=new double [100];
p2=p1;
delete [] p1;
*p2=44.0;
) то как проверить?
Это тоже сен?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.03.2010, 10:43     try #4
1. "Мне же ссылку надо вернуть! Или это пройдёт?" - а фиг его знает, не проверял. Тут смысл только в том, чтобы как-то успокоить компилятор. Любой способ хорош.
2. "А если указатель не NULL, но и не действителен - то как проверить?" - никак. Тут язык тебе ничем не поможет. В Win, например, можешь использовать функции вида IsBadReadPtr, IsBadCodePtr.... и т.п. Но даже и они не дают 100%-ной гарантии действительности указателя.
3. "Спасибо. Где? " - упс! Тебя забанили в Гугле??? :-)

Добавлено через 6 минут
4. "Это тоже сен? " - нет, это не SEH. Это просто UB. Что-то произойдет, но что именно - неизвестно. Такой баг довольно коварен и ловить его можно очень-очень долго. Лучший совет, который я могу дать - в C++ вообще не пользоваться "плоскими" (или, как их еще называют, "глупыми") указателями, предпочитая разного рода smart pointers, коих изобретено уже неимоверное количество.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2010, 12:16  [ТС]     try #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
Тебя забанили в Гугле??? :-)
. Нарушать я мастер, но не до такой же степени!

Добавлено через 3 минуты
Цитата Сообщение от CheshireCat Посмотреть сообщение
"Мне же ссылку надо вернуть! Или это пройдёт?" - а фиг его знает, не проверял. Тут смысл только в том, чтобы как-то успокоить компилятор. Любой способ хорош.
C++
1
2
3
4
5
6
7
8
9
10
double & operator [] (int i)
{
 static double z;
 if (i<number)
 {
  return Data[i];
 }
 throw  std::out_of_range("Индекс вне диапазона!");
 return *((double *)((void *) this));
}
Так?

Добавлено через 4 минуты
_set_se_translator
Handles Win32 exceptions (C structured exceptions) as C++ typed exceptions.
. Я unixоид!
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.03.2010, 09:44  [ТС]     try #6
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
void ReSize (unsigned int Number)
{
 if (Data)
 {
  delete [] Data;
 }
 if (Number)
 {
  Data=new double [Number]
  if (Data)
  {
   this->Number=Number;
  }
  else
  {
   throw ....; // Как отбросить аут оф мэмори?
  }
 }
 else
 {
  Data=NULL;
  this->Number=0;
 }
}
Добавлено через 2 часа 56 минут
out_of_range не является челном std
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
17.03.2010, 14:47     try #7
Упс! Это какой же компиль позволяет себе столь нагло нарушать Стандарт 19.1.5 ??? "Не верю!" (с)
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.03.2010, 14:57     try #8
taras atavin,
1. Не надо проверять на NULL указатель перед вызовом delete. delete NULL легальная операция. Избавься от лишних проверок.
2. При нехватке памяти будет по стандарту и так возбуждено исключение std::bad_alloc.
3. Для использования std::out_of_range необходимо подключить <stdexcept>.

Не по теме:

Может все таки стоит взять в руки нормальную литературу и попробовать почитать?

outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
17.03.2010, 16:21     try #9
CyBOSSeR, если не сложно, дайте литературу, где обраьотка исключений описана лучше всего..
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
17.03.2010, 16:31     try #10
Николай Джосаттис, "С++ Стандартная библиотека" - существует в электронном виде, гугл в помощь.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.03.2010, 16:40     try #11
outoftime, У Скота Майерса в книге Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов есть глава, посвященная исключениям.
Да и вообще книга стоящая.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 08:30  [ТС]     try #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
Упс! Это какой же компиль позволяет себе столь нагло нарушать Стандарт 19.1.5 ??? "Не верю!" (с)
GCC. И в чём именно нарушение?
Yandex
Объявления
18.03.2010, 08:30     try
Ответ Создать тему
Опции темы

Текущее время: 07:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru