Форум: "Прочее";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];
ВнизФункция, возвращающая строку ошибки Найти похожие ветки
← →
Пробегал... (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" например, и вот тут то и грабли…
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.06 c