Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизКак правильно обработать ошибку внутри класса? Найти похожие ветки
← →
MegaVolt (2004-05-20 11:26) [0]Есть такой код
unit xcf;
interface
uses classes, Sysutils, Dialogs;
type
Txcf = class
private
FFileName: String;
procedure SetFileName(const Value: String);
{ Private declarations }
public
{ Public declarations }
property FileName:String read FFileName write SetFileName;
end;
implementation
{ Txcf }
procedure Txcf.SetFileName(const Value: String);
begin
if not FileExists(Value)
then
begin
ShowMessage("Файл не найден");
exit;
end;
FFileName := Value
end;
end.
На сколько я понимаю такой код не совсем правильный т.к. класс вроде бы не должен самостоятельно выдавать сообщения и ошибки. Как преобразовать этот пример к правильному виду чтобы и пользователь увидел ошибку и в классе небы ло бы вызовов ShowMessage?
← →
Тимохов © (2004-05-20 11:33) [1]
>
> На сколько я понимаю такой код не совсем правильный
"Парвильно" категоря субъективная. В коде никакого криминала нет. Все зависит от того, как вы данный методи используете.
Более "модным" и правльным способом является возбуждение исключений. Например
if not FileExists(...) then raise Excf.create("file not exists!");
Но можно обойтись и таким. Все зависит от вашей задачи. Иногда (у меня пару раз бывало)противопоказано пускать исключение дальше. Если у вас именно такой случай - то все ок.
← →
Leon © (2004-05-20 11:35) [2]MeesageBox()+F1 из Windows (не Application.MessageBox).
Но, наверно, это тоже не хорошо - зато работает!
← →
Clickmaker © (2004-05-20 11:38) [3]Ну есть такой вариант еще
type
Txcf = class
private
FFileName: String;
FLastError: String;
procedure SetFileName(const Value: String);
{ Private declarations }
public
{ Public declarations }
property FileName:String read FFileName write SetFileName;
property LastError: string read FLastError;
end;
implementation
{ Txcf }
procedure Txcf.SetFileName(const Value: String);
begin
if FileExists(Value) then begin
FFileName := Value;
FLastError := "";
end else
FLastError := "Файл не найден";
end;
end.
xcf.FileName := "c:\xxx.jpg";
if (xcf.LastError <> "") then ShowMessage(xcf.LastError);
Хотя, лучше все-таки с экцепшенами
← →
Гаврила © (2004-05-20 11:41) [4]raise однозначно
← →
qarTvel (2004-05-20 11:44) [5]используй
raise
... так делается во всех нормальных прогах ...
← →
MegaVolt (2004-05-20 11:49) [6]Попробовал raise так он не даёт параметром вставить строку содержащую описание ошибки. Выдаёт просто что модуль вызвал исключение. А как всунуть именно код ошики?
← →
Тимохов © (2004-05-20 11:52) [7]
> так делается во всех нормальных прогах ...
как вы категоричны. :))))
в борланде дураки, чтоли использовать в system.pas assert?
или в OleCtnrs использовать application.messagebox - тоже дураки?
или вы дельфи не относите к нормальной проге? :))))))
имхо - зависит от задачи.
еще раз имхо.
← →
Тимохов © (2004-05-20 11:54) [8]
> MegaVolt (20.05.04 11:49) [6]
и как же вы попробовали?
покажите что ли...
← →
MegaVolt (2004-05-20 11:58) [9]Так как Вы написали:
procedure Txcf.SetFileName(const Value: String);
begin
if not FileExists(Value) then raise Txcf.create("Файл не найден");
FFileName := Value;
end;
← →
GLFox (2004-05-20 11:59) [10]А че? Нельзя как в WinAPI, например? Функция может возвращать какой-нить код ошибки или True/False.
← →
Silver Alex © (2004-05-20 12:03) [11]
> А как всунуть именно код ошики?
raise Exception.Create("Main Error");
или
try
...
except
on E: Exception do
raise Exception.Create("Main error"#13#13 +e.Message);
end ;
← →
Тимохов © (2004-05-20 12:03) [12]
> MegaVolt (20.05.04 11:58) [9]
Я разве так писал? :)))))
← →
MegaVolt (2004-05-20 12:03) [13]Можно но муторно получается если ошибка в какой нибудь глубокой функции и подымать код ошибки на самый верх нужно. Да и например в этом примере явного вызова процедуры или функции нету так что и код возвращать некому
← →
MegaVolt (2004-05-20 12:04) [14]Можно но муторно получается если ошибка в какой нибудь глубокой функции и подымать код ошибки на самый верх нужно. Да и например в этом примере явного вызова процедуры или функции нету так что и код возвращать некому
← →
Clickmaker © (2004-05-20 12:04) [15]
> raise Txcf.create("Файл не найден");
raise Exception.Create(... наверно
или свой тип определить Excf = class(Exception)
← →
MegaVolt (2004-05-20 12:10) [16]ты написал Excf но на такую запись тоже ругается говорит нету такого Excf :(
А вот Exception.Create(... проходит на ура :)
← →
MegaVolt (2004-05-20 12:10) [17]ты написал Excf но на такую запись тоже ругается говорит нету такого Excf :(
А вот Exception.Create(... проходит на ура :)
← →
GLFox (2004-05-20 12:11) [18]Как вариант можно организовать аналог GetLastError().
← →
MegaVolt (2004-05-20 12:13) [19]GLFox: а поподробнее пожалуйста?
← →
Clickmaker © (2004-05-20 12:17) [20]
> MegaVolt (20.05.04 12:13) [19]
> GLFox: а поподробнее пожалуйста?
см. Clickmaker © (20.05.04 11:38) [3]
← →
MegaVolt (2004-05-20 12:19) [21]А.... Понял :)
← →
Романов Р.В. © (2004-05-20 12:50) [22]Как вариант
http://delphimaster.net/view/15-1084962548/
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.033 c