Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1084526464
Карелин Артем
2004-05-14 13:21
2004.05.30
Где взять бесплатный невидимый счетчик на страницу?


1-1084610801
fish
2004-05-15 12:46
2004.05.30
Загрузка программы


11-1074200421
Neep
2004-01-16 00:00
2004.05.30
Создание меню без MCK


14-1083995978
MasterA
2004-05-08 09:59
2004.05.30
Mail


1-1084813088
Sour
2004-05-17 20:58
2004.05.30
JvInspecor из JCVL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский