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

Вниз

Как правильно обработать ошибку внутри класса?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
11-1073933570
Phantomaz
2004-01-12 21:52
2004.05.30
Как поменять шрифт и цвет текста Item ов в PopupMenu ?


8-1079352161
Ziko
2004-03-15 15:02
2004.05.30
Разрешение JPEG изображения


1-1084967551
infom
2004-05-19 15:52
2004.05.30
Может кто встречал такое дополнение к Delphi


9-1074697548
TButton
2004-01-21 18:05
2004.05.30
delphiX вывод текста


6-1081396969
valex1
2004-04-08 08:02
2004.05.30
Отправка через MicroSoft Outlook