Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.30;
Скачать: CL | DM;

Вниз

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

 
Пробегал...   (2008-02-13 16:50) [0]

Как вы относитесь к таким функциям? То есть, функция, которая в случае успеха возвращает пустую строку, в случае неуспеха возвращает строку ощибки.
С одной стороны вроде логично, с другой почему-то ни в каких исходниках это не встречал. Чем может быть плохо?

P.S. Альтернатива понятна - использование исключений и в вызывающем коде для записи лога или вывода пользователю использовать E.Message. Но если не хочется исключений?


 
Kolan ©   (2008-02-13 16:52) [1]

> Как вы относитесь к таким функциям?

Плохо, потому, что в общем случае непонятно что пустая строка — это успех. Для успеха/неудачи уже придумали тип — Boolean называется.


 
Palladin ©   (2008-02-13 16:53) [2]

если их написал я - то нормально отнесусь
если кто то другой - обкакаю!

:)

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


 
Palladin ©   (2008-02-13 16:54) [3]

ошибки же обрабатывать нужно, а не только пользователю показывать...


 
DiamondShark ©   (2008-02-13 16:56) [4]


> Чем может быть плохо?

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

2. Строку задолбишься сравнивать.

3. Часто строка нафиг не нужна, и даже код ошибки не нужен, достаточно признака удачно/облом.


 
DiamondShark ©   (2008-02-13 16:58) [5]

а вообще, возвращать ничего не надо.
унутре функций должен стоять Halt при ошибке.


 
Rouse_ ©   (2008-02-13 17:03) [6]


> С одной стороны вроде логично, с другой почему-то ни в каких
> исходниках это не встречал.

Эмм... А SysErrorMessage(GetLastError) тоже не видел? :)


 
Пробегал...   (2008-02-13 17:12) [7]

Поясню.

Там где текст ошибки не нужен - понятное дело нет смысла возвращать текст ошибки ;)

Что касается лучше устанавливать код ошибки... Видимо, да. Но если ошибка нестандартна? Искать похожую в WinApi и устанавливать SetLastError?
Или наверное есть специальный диапазон пользовательский, в котором можно устанавливать свои ошибки и который не использует система?
Тогда можно наверное просто переделать SysErrorMessage на SysErrorMessageMy например ;) Которая будет вызывать SysErrorMessage для системных ошибок и возвращать текст для "своих" ошибок?

DiamondShark ©   (13.02.08 16:56) [4]
2. Строку задолбишься сравнивать.


а зачем ее с чем-то сравнивать?


 
Palladin ©   (2008-02-13 17:17) [8]

а зачем тебе тогда string возвращать? сразу на месте ShowMessage и Abort нафик...


 
Пробегал...   (2008-02-13 17:21) [9]

во-первых, программа может работать как неинтерактивный сервис, какой нафиг ShowMessage.

Во-вторых, функция может исполняться не в основном потоке.

В-третьих, это самодостаточная функция, например из какого-то готового набора функций или класса. Вряд ли бы тебе понравилось, если какой-нибудь используемый класс пытался выдавать ошибки через ShowMessage


 
Palladin ©   (2008-02-13 17:24) [10]


> Вряд ли бы тебе понравилось, если какой-нибудь используемый
> класс пытался выдавать ошибки через ShowMessage

ShowMessage заменяется на подходящее по контексту LogWriteLn, SendToMail, PutToWebSite... иначе на кой тебе текст ошибки... а раз он ни на кой не нужен то возвращаемся к твоему


> Там где текст ошибки не нужен - понятное дело нет смысла
> возвращать текст ошибки


 
DiamondShark ©   (2008-02-13 17:28) [11]


> Пробегал...   (13.02.08 17:12) [7]
> DiamondShark ©   (13.02.08 16:56) [4]
> 2. Строку задолбишься сравнивать.
>
> а зачем ее с чем-то сравнивать?

А зачем тогда вообще что-то возвращать?


 
Kolan ©   (2008-02-13 17:32) [12]

> [4] DiamondShark ©   (13.02.08 16:56)

Кроме того со временем удача может изменится с "" на "Ok" например, и вот тут то и грабли&#133


 
DiamondShark ©   (2008-02-13 17:39) [13]


> Kolan ©   (13.02.08 17:32) [12]
> > [4] DiamondShark ©   (13.02.08 16:56)
>
> Кроме того со временем удача может изменится с "" на "Ok"
> например, и вот тут то и грабли…

Это как раз фигня, она точно так же может измениться с "не 0" на 17.

А вот то, что возврат строки требует наличия менеджера памяти, свободного места в куче и цикла перегонки байтов -- это уже не фигня.


 
ketmar ©   (2008-02-13 17:55) [14]

>[0] Пробегал... (2008-02-13 16:50:00)
>Как вы относитесь к таким функциям?

идиотизм.

>если не хочется исключений?
ССЗБ.

---
Understanding is not required. Only obedience.


 
Пробегал...   (2008-02-13 17:59) [15]

Palladin ©   (13.02.08 17:24) [10]
ShowMessage заменяется на подходящее по контексту LogWriteLn, SendToMail, PutToWebSite...


по какому контексту? Вот допустим есть некий КЛАСС, инкапсулирующий работу с чем-то. Он возвращает код ошибки в случае чего. Откуда он знает, КУДА его писать? Это уже дело разработчика программы, или в лог, или на экран выводить. Черный ящик не может знать путей вывода информации.

DiamondShark ©   (13.02.08 17:28) [11]
А зачем тогда вообще что-то возвращать?


чтобы записать ошибку в лог, вывести пользователю на экран и подобное.


 
Palladin ©   (2008-02-13 18:11) [16]


> [15] Пробегал...   (13.02.08 17:59)

тада смотри

кетмар[14] пункт 2
бо исключениями это решается легко и беззаботно, без всяких анализов на пустую строку...


 
Пробегал...   (2008-02-13 18:18) [17]

Palladin ©   (13.02.08 18:11) [16]
бо исключениями это решается легко и беззаботно


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

Тогда по-другому - а как эта проблема решается, например, на C++?
А еще интересно про C#


 
Virgo_Style ©   (2008-02-13 18:21) [18]

Полагаю, пара аналогов SysErrorMessage и GetLastError - это самое оно, если без исключений. Хочешь код - есть код, хочешь текст - бери текст... Завязываться на то, что текст со временем не изменится - это чревато. А в случае локализации вообще изврат какой-то получится, imho.


 
clickmaker ©   (2008-02-13 18:23) [19]


> Тогда по-другому - а как эта проблема решается, например,
> на C++?
> А еще интересно про C#

а что с ними не так?


 
ketmar ©   (2008-02-13 18:28) [20]

>[19] clickmaker © (2008-02-13 18:23:00)
буквы «c» в слове Delphi нет, вот и неясно.

---
Understanding is not required. Only obedience.


 
Пробегал...   (2008-02-13 18:34) [21]

clickmaker ©   (13.02.08 18:23) [19]
а что с ними не так?


как же мне надоело такие перевопросы... А что, я где-то сказал чт ос ними что-то не так. Я если вы не заметили спросил:

"а как эта проблема решается, например, на C++?"


 
Palladin ©   (2008-02-13 18:36) [22]

как как... функция чего то возвращает и явно не char*, а что нибудь типа int, если int не true, то существует функция geterrorstring для каждого из случаев...


 
ketmar ©   (2008-02-13 18:44) [23]

>[22] Palladin © (2008-02-13 18:36:00)
это… там тоже исключения есть. %-)

---
Understanding is not required. Only obedience.


 
Palladin ©   (2008-02-13 18:46) [24]

та я знаю :) просто он спросил как там делают без их использования... :)


 
Пробегал...   (2008-02-13 18:48) [25]

Palladin ©   (13.02.08 18:36) [22]

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


 
Пробегал...   (2008-02-13 18:50) [26]

Palladin ©   (13.02.08 18:46) [24]
та я знаю :) просто он спросил как там делают без их использования... :)


да нет, можно и с их использованием. А самый популярный способ - это именно исключения? Я мало видел исходников на C, но ощущение, что стиль там программирования другой, не любят сишники исключений. В таких случаях именно исключения используют или что-то еще есть?


 
ketmar ©   (2008-02-13 18:52) [27]

вот интересно, а какая связь между C и «C++/C#» (окромя curly bracets?)

---
Understanding is not required. Only obedience.


 
Palladin ©   (2008-02-13 18:55) [28]


> вот интересно, а какая связь между C и «C++/C#»

+ сто тыщ миллионов...


 
DiamondShark ©   (2008-02-13 19:03) [29]


> Я мало видел исходников на C, но ощущение, что стиль там
> программирования другой, не любят сишники исключений.

Наверное, потому что в С их нет.


 
Пробегал...   (2008-02-13 20:30) [30]

Атмосфера на форуме просто ужасная. Самый высший принцип - как-нибудь поддеть задащего вопрос, растерзать, прицепиться к словам. Что угодно, главное доказать что вопрошающий - лох, а значит хрен с ним... ;(


 
Пробегал...   (2008-02-13 20:32) [31]

ладно, спрошу так:

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


 
Palladin ©   (2008-02-13 20:43) [32]


>  Пробегал...

да ктож тебя лохом то обозвал? покажи пальчиком... все наоборот советуют переходить дорогу в положеном месте... и не на светофоры смотреть, а на машины... бо светофоры еще никого не сбивали...


 
Пробегал...   (2008-02-13 21:04) [33]

к вопросу озвученному в [31] хотелось бы добавить еще один вопрос, который я уже задавал в этой ветке:

есть специальный диапазон пользовательский, в котором можно устанавливать свои ошибки и который не использует система?


 
TUser ©   (2008-02-13 22:04) [34]

Это зависит от задачи.


 
Мазут Береговой   (2008-02-13 23:54) [35]


> Пробегал...   (13.02.08 20:32) [31]
> ладно, спрошу так:
>
> На реализации языка C++ фирмой Microsoft в своем пакете
> VS.NET 2005 как обычно программисты пишут в таких ситуациях?
>  Именно исключения используют или принята другая технология
> какая-нибудь?

не знаю как С++, но С# используются обычный try{} catch(){} finally{} блок.
в любом месте можно самостоятельно выкинуть ошибку throw new Exception()... и т.д.


 
Celades ©   (2008-02-14 00:19) [36]


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

Конечно все нормальные используют исключения. Грех таким инструментом не воспользоваться. Но в С++ есть одна классная фича, которая позволяет работать с исключениями очень удобно - это автоматические деструкторы.


 
Sandman25   (2008-02-14 08:47) [37]

Celades ©   (14.02.08 00:19) [36]

В других языках еще удобнее - сборщики мусора :)


 
oldman ©   (2008-02-14 08:58) [38]


> То есть, функция, которая в случае успеха возвращает пустую
> строку, в случае неуспеха возвращает строку ощибки.


если бы все так просто было в этой жизни... :(((

обычно успех\неуспех вычисляются по полученным данным.
или их отсутствию.
прога же не напишет "ошибка в днк"...


 
Riply ©   (2008-02-14 11:01) [39]

> [33] Пробегал...   (13.02.08 21:04)
> к вопросу озвученному в [31] хотелось бы добавить еще один вопрос,
> который я уже задавал в этой ветке:

> есть специальный диапазон пользовательский,
> в котором можно устанавливать свои ошибки и который не использует система?

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


 
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

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



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

Текущий архив: 2008.03.30;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.048 c
2-1204638436
Тфьу
2008-03-04 16:47
2008.03.30
Как перекинуть Variant в TBitmap?


2-1204118277
Artem
2008-02-27 16:17
2008.03.30
Событие


2-1204353229
Lamer666
2008-03-01 09:33
2008.03.30
Как лучше обработать результаты GET?


2-1204201182
ply
2008-02-28 15:19
2008.03.30
Выполнить действие для всех объектов формы


3-1194530578
-=Le][=-
2007-11-08 17:02
2008.03.30
Фильтр для получения списка значений.