Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Вниз

Функция, возвращающая строку ошибки   Найти похожие ветки 

 
clickmaker ©   (2008-02-14 11:14) [40]


> На реализации языка C++ фирмой Microsoft в своем пакете
> VS.NET 2005 как обычно программисты пишут в таких ситуациях?

на C++/C#/VB.NET работа с исключениями мало отличается от дельфийской.
Если используешь MFC, то там есть базовый класс CException, как и в Дельфи.
В любом случае, целесообразность использования исключений определяется
кодом.
Например, код
try {
 CheckProc1();
 ...
 CheckProcN()
}
catch (...) {
 MessageBox(...);
}
выглядит читабельней, чем, скажем такой, уходящий за горизонт лестницей
if (CheckProc1()) {
 ...
                          if (CheckProcN() {
                              // все хорошо
                         }
                         else {
                            // не совсем хорошо
                         }
}
else
 // совсем не хорошо
Если пишешь некую DLL, то хорошим тоном считается, когда функция возвращает
- код ошибки и предоставляет функцию для получения текста по коду
- 1 или 0 и предоставляет нечто вроде GetLastError или GetLastErrorText
- устанавливает код ошибки в своем диапазоне путем SetLastError и предоставляет интерфейс для функции FormatMessage с флагом FORMAT_MESSAGE_FROM_HMODULE

Выбор способа зависит от степени испорченности программиста.


 
Mystic ©   (2008-02-14 11:47) [41]

В случае, когда функция возвращает строковое описание ошибки, могут быть следующие проблемы:

1) Производительность
2) Проблемы с локализацией
3) Проверка на определенный тип ошибки

Например, если мы кидаем ошибку
"0.5" is not valid integer value
то установить в коде какая ошибка произошла достаточно проблематично

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

if SomeFunc() <> "" then ..

или

if SomeFunc() <> NO_ERROR then ..

Преимущества передачи кода ошибки в простоте, иногда в производительности.


> 1. В особо тяжёлых случаях (например, в условиях острой
> нехватки памяти) может не получиться вернуть строку. Интегер
> всегда получится вернуть.


Статическая строка располагается в образе и не требует операций с динамической памятью.


 
ketmar ©   (2008-02-14 14:31) [42]

>[33] Пробегал... (2008-02-13 21:04:00)
есть. если бы ты дал себе труд хоть раз почитать заголовочные файлы, ты бы не задавал такой идиотский вопрос.

---
Understanding is not required. Only obedience.


 
Пробегал...   (2008-02-14 15:44) [43]

Riply ©   (14.02.08 11:01) [39]
> есть специальный диапазон пользовательский,
> в котором можно устанавливать свои ошибки и который не использует система?

http://delphimaster.net/view/2-1197810242/


ветка не найдена!

clickmaker ©   (14.02.08 11:14) [40]
Mystic ©   (14.02.08 11:47) [41]

Ясно... спасибо большое!


 
Riply ©   (2008-02-14 17:08) [44]

>  [43] Пробегал...   (14.02.08 15:44)
> Riply ©   (14.02.08 11:01) [39]
> ветка не найдена!

Sorry. Я то клиентом пользуюсь - не заметила, что удалена.
Вот вырванные куски из той ветки:

Рекомендую читать Рихтера самую первую главу.
Для своих ошибок должен быть установлен соответствующий флаг в 29ом бите.
GetLastError значения - это вроде те же NTSTATUS.
Не все виндовс коды получаются из SysErrorMessage, например для ошибок WinInet надо указывать в FormatMessage хендл dllки WinInet

> GetLastError значения - это вроде те же NTSTATUS.
Без старших битов только.

Коды во внешних дллках, типа вининетовских там не показываются, т.к. там вообще нет подключения внешней длл.
Поэтому лучше Error Lookup если юзать студию, или самому сделать.

Вот полезная цитата из WinError.h
//
// Map a WIN32 error value into a HRESULT
// Note: This assumes that WIN32 errors fall in the range -32k to 32k.
//
// Define bits here so macros are guaranteed to work

#define FACILITY_NT_BIT                 0x10000000

// __HRESULT_FROM_WIN32 will always be a macro.
// The goal will be to enable INLINE_HRESULT_FROM_WIN32 all the time,
// but there"s too much code to change to do that at this time.

#define __HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))

#ifdef INLINE_HRESULT_FROM_WIN32
#ifndef _HRESULT_DEFINED
#define _HRESULT_DEFINED
typedef long HRESULT;
#endif
#ifndef __midl
__inline HRESULT HRESULT_FROM_WIN32(long x) { return x <= 0 ? (HRESULT)x : (HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000);}
#else
#define HRESULT_FROM_WIN32(x) __HRESULT_FROM_WIN32(x)
#endif
#else
#define HRESULT_FROM_WIN32(x) __HRESULT_FROM_WIN32(x)
#endif

//
// Map an NT status value into a HRESULT
//

#define HRESULT_FROM_NT(x)      ((HRESULT) ((x) | FACILITY_NT_BIT))


 
Пробегал...   (2008-02-14 17:30) [45]

Riply ©   (14.02.08 17:08) [44]

ок, я понял,

не понял я одно - а что происходит если вызывать FormatMessage с флагом FORMAT_MESSAGE_FROM_HMODULE?

"Specifies that lpSource is a module handle containing the message-table resource(s) to search"

что это за message-table resource? DLL должна экспортировать какую-то определенную функцию с определенным названием? Вроде нет, так как к EXE тоже применимо...


 
ketmar ©   (2008-02-14 18:46) [46]

Удалено модератором


 
Пробегал...   (2008-02-14 18:56) [47]

Удалено модератором


 
ketmar ©   (2008-02-14 19:15) [48]

Удалено модератором
Примечание: Правила читаем и уважаем


 
clickmaker ©   (2008-02-15 10:45) [49]


> что это за message-table resource? DLL должна экспортировать
> какую-то определенную функцию с определенным названием?

среди этих трех слов есть хоть что-то отдаленно напоминающее слово "функция"?


 
Пробегал...   (2008-02-15 14:49) [50]

Удалено модератором



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.046 c
2-1204133404
Рустам
2008-02-27 20:30
2008.03.30
dbgrid


2-1204210167
махс
2008-02-28 17:49
2008.03.30
try..finally


2-1204027484
Эрни
2008-02-26 15:04
2008.03.30
найти каталог


15-1202622908
Cyrax
2008-02-10 08:55
2008.03.30
Обязаны ли комп. магазины заполнять гарантийн талон производител


2-1204129187
123... Yo, nigga!
2008-02-27 19:19
2008.03.30
listview as grid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский