Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
mh-coder
-36 / 29 / 4
Регистрация: 01.02.2014
Сообщений: 839
1

Можно ли вернуть имя функции, вернувшей ошибку? Стандартами winapi

16.09.2014, 19:54. Просмотров 394. Ответов 7
Метки нет (Все метки)

например FormatMessage может вернуть описание ошибки, а может ли она или какая ни будь другая функция вернуть имя функции которая вызвала ошибку?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2014, 19:54
Ответы с готовыми решениями:

Как вернуть из функции ошибку и её расшифровку?
Вот пример функции: int test(int i) { if (!i) { //Добавить к возврату...

Можно из функции вернуть статический массив?
Есть функция float calculation_Psi( float Psi_old, float Omega ){ ...

Можно ли утверждать, что в C++ имя функции - константный указатель на функцию ?
В учебнике "Освой самостоятельно C++ за 24 часа" (Либерти, Хорват) говорится,...

Имя функции вернувшей ошибку, трассировка стека
В общем суть такова. Хотелось бы в случае, если апишная функция завершилась...

Как можно вернуть из функции более 1 значения?
Matlab. Как можно вернуть из функции более 1 значения? Может как-нибудь типа...

7
quwy
Native x86
3338 / 2184 / 650
Регистрация: 13.02.2013
Сообщений: 7,239
16.09.2014, 20:01 2
Нет. Код ошибки -- это обычное число.
1
HighPredator
5685 / 2005 / 722
Регистрация: 10.12.2010
Сообщений: 5,767
Записей в блоге: 3
17.09.2014, 10:04 3
Если ваш компилятор поддерживает C99/C++11 (кажется такие версии), то можно провернуть это дело следующим образом:
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
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
static char errorneousFunctionName[128];
static int errorOccured = 0;
 
void TestFunction1(const int a)
{
  if (a == 0)
  {
    /* invalid parameter */
    errorOccured = 1;
    strcpy(errorneousFunctionName, __func__);
  }
  else
  {
    errorOccured = 0;
    printf("Passed argument is %d\n", a);
  }
}
 
int TestFunction2(const int a)
{
  int returnValue = 0;
  if (a == 0)
  {
    /* invalid parameter */
    errorOccured = 1;
    strcpy(errorneousFunctionName, __func__);
  }
  else
  {
    errorOccured = 0;
    returnValue = 12 / a;
  }
  return returnValue;
}
 
int main(void)
{
  char str[256];
  int res = 0;
  
  TestFunction1(12);
  if (errorOccured)
  {
    sprintf(str, "Error occured in function '%s'", errorneousFunctionName);
    printf("%s\n", str);
  }
  res = TestFunction2(12);
  if (errorOccured)
  {
    sprintf(str, "Error occured in function '%s'", errorneousFunctionName);
    printf("%s\n", str);
  }
  else
  {
    printf("%d\n", res);
  }
 
  TestFunction1(0);
  if (errorOccured)
  {
    sprintf(str, "Error occured in function '%s'", errorneousFunctionName);
    printf("%s\n", str);
  }
  res = TestFunction2(0);
  if (errorOccured)
  {
    sprintf(str, "Error occured in function '%s'", errorneousFunctionName);
    printf("%s\n", str);
  }
  else
  {
    printf("%d\n", res);
  }
  return 0;
}
0
Убежденный
Ушел с форума
Эксперт С++
15999 / 7270 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.09.2014, 11:02 4
Цитата Сообщение от mh-coder Посмотреть сообщение
FormatMessage может вернуть описание ошибки, а может ли она или какая ни будь другая функция вернуть имя функции которая вызвала ошибку?
Stack trace устроит ?

StackWalk64 function
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Но вопрос: зачем ?
Для ловли ошибок есть SetUnhandledExceptionFilter + MiniDumpWriteDump,
отладочные символы, OutputDebugString/WPP Tracing и тому подобное.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2014, 11:20 5
Цитата Сообщение от HighPredator Посмотреть сообщение
Если ваш компилятор поддерживает C99/C++11
Собственно и раньше можно было получать имя функции, другое дело, что не переносимо.
Однако, в стандартные функции же не вставишь упомянутую обработку. А ТС, судя по всему, хочет из errno ещё и имя функции получить.
0
HighPredator
5685 / 2005 / 722
Регистрация: 10.12.2010
Сообщений: 5,767
Записей в блоге: 3
17.09.2014, 12:26 6
Цитата Сообщение от Tulosba Посмотреть сообщение
Собственно и раньше можно было получать имя функции, другое дело, что не переносимо.
Однако, в стандартные функции же не вставишь упомянутую обработку. А ТС, судя по всему, хочет из errno ещё и имя функции получить.
Собственно сейчас открыл стандарт c99, и там __func__ описан как predefined identifier. То есть в моем понимании сие есть требование стандарта, и, как следствие, переносимо. Есть подобное для плюсов, может кто посмотреть (а то у нас sharepoint лежит)?
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.09.2014, 12:43 7
Цитата Сообщение от HighPredator Посмотреть сообщение
c99, и там __func__ описан как predefined identifier
Говоря про переносимость, я имел в виду эпоху до c99/c++11.
С++11 8.4.1/8
The function-local predefined variable __func__ is defined as if a definition of the form
static const char __func__[] = "function-name ";
had been provided, where function-name is an implementation-defined string. It is unspecified whether such
a variable has an address distinct from that of any other object in the program.
1
HighPredator
5685 / 2005 / 722
Регистрация: 10.12.2010
Сообщений: 5,767
Записей в блоге: 3
17.09.2014, 13:11 8
Цитата Сообщение от Tulosba Посмотреть сообщение
Говоря про переносимость, я имел в виду эпоху до c99/c++11.
А, ок.
0
17.09.2014, 13:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2014, 13:11

Можно ли изнутри функции узнать ее имя?
Можно ли изнутри функции узнать ее имя? Или - поставлю вопрос более широко:...

Как вернуть курсор в функции оракл и вызвать ее в C#, используя интерфейс OLEDB, можно ADO.NET
есть функция оракл, думаю она правильная: create or replace package...

Возможно ли как-то, зная имя класса, вернуть в каком-либо методе имя класса?
Добрый день! Интересуюсь. Есть Обобщенный метод, например: Add&lt;T&gt;(string...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru