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

Вниз

Exception при записи файла в недоступную для записи папку   Найти похожие ветки 

 
User   (2010-05-29 09:00) [0]

Какой Exception активируется, если попытаться записать файл в недоступную для записи папку.


 
_Юрий ©   (2010-05-29 09:34) [1]

Получение ответа на этот вопрос эмпирическим путем занимает меньше времени, чем публикация вопроса на форуме :-)


 
Омлет ©   (2010-05-29 10:45) [2]

Кем активируется?

constructor TFileStream.Create(const FileName: string; Mode: Word; Rights: Cardinal);
begin
 if Mode = fmCreate then
 begin
   inherited Create(FileCreate(FileName, Rights));
   if FHandle < 0 then
     raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
 end
 else
 begin
   inherited Create(FileOpen(FileName, Mode));
   if FHandle < 0 then
     raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
 end;
end;


 
Anatoly Podgoretsky ©   (2010-05-29 10:57) [3]

> Омлет  (29.05.2010 10:45:02)  [2]

Так отладчик сразу покажет.


 
User   (2010-05-29 20:16) [4]

EFCreateError - вот что мне требовалось узнать.


 
User   (2010-05-29 20:24) [5]

Прошу прощения, оказалось, что и это не то, что мне нужно. Приведу кусок кода:

try
 with TIniFile.Create("Z:\Settings.ini") do
 try
   WriteInteger("Application", "FormLeft", Form1.Left);
   WriteInteger("Application", "FormTop", Form1.Top);
 finally
   Free;
 end;
except
 on classes.EWriteError do ShowMessage("Some error text") else
end;


Я выбрал несуществующий на моем компьютере путь Z:\..., чтобы проверить, вызовется ли EWriteError при попытке записи или нет.

К сожалению он не вызывается. Что не так в коде?


 
Anatoly Podgoretsky ©   (2010-05-29 20:32) [6]

> User  (29.05.2010 20:24:05)  [5]


except
  ShowMessage("Some error text") else
end;



 
User   (2010-05-29 20:35) [7]


> Anatoly Podgoretsky

Да, наверно лучше так.


 
Loginov Dmitry ©   (2010-05-29 22:26) [8]


> Я выбрал несуществующий на моем компьютере путь Z:\...,
> чтобы проверить, вызовется ли EWriteError при попытке записи
> или нет.
>
> К сожалению он не вызывается. Что не так в коде?


А почему он должен вызываться? Кто-то это обещал?

Вот выдержка из исходников:

procedure TIniFile.WriteString(const Section, Ident, Value: string);
begin
 if not WritePrivateProfileString(PChar(Section), PChar(Ident),
                                  PChar(Value), PChar(FFileName)) then
   raise EIniFileException.CreateResFmt(@SIniFileWriteError, [FileName]);
end;


Как видно, причину ошибку тут понять нельзя. Обертка TIniFile весьма несовершенна.

Выяснить причину ошибки позволяет GetLastError.


 
бумбум   (2010-05-30 07:38) [9]

Исходя из задачи непросто ли проверить сушествования пути каталога:
If not DirectoryExists("Z:\") then
ShowMessage("Net papki");


 
Anatoly Podgoretsky ©   (2010-05-30 09:32) [10]

> бумбум  (30.05.2010 07:38:09)  [9]

А вопрос то про доступность папки, а не про наличие.


 
Плохиш ©   (2010-05-30 16:51) [11]


> except
>  on classes.EWriteError do ShowMessage("Some error text")
> else
> end;
>
>

Я бы убил.


 
Юрий Зотов ©   (2010-05-30 20:21) [12]

> User   (29.05.10 20:24) [5]
try
 ...
except
 on e: Exception do
begin
   ShowMessage(e.ClassName);
   raise
 end
end;


 
Германн ©   (2010-05-31 03:02) [13]


> Юрий Зотов ©   (30.05.10 20:21) [12]

А зачем после @ShowMessage(e.ClassName);
raise?


 
Anatoly Podgoretsky ©   (2010-05-31 06:59) [14]

Чтобы продолжить обработку ошибки.
> Я бы убил.

Тут нужно уточнение


 
Юрий Зотов ©   (2010-05-31 08:31) [15]


> Германн ©   (31.05.10 03:02) [13]

Иначе Плохиш убьет. И правильно сделает.


 
12 ©   (2010-05-31 09:04) [16]


> except
>  on e: Exception do
> begin
>    ShowMessage(e.ClassName);
>    raise
>  end
> end;

сколько смотрю - и всегда замечаю
как Вам всегда удается точку с запятой не ставить там, где ее можно не ставить? 6)


 
Anatoly Podgoretsky ©   (2010-05-31 09:20) [17]

> 12  (31.05.2010 09:04:16)  [16]

Надеюсь Юрий не убьет :-)
Точку с запятой можно не ставить перед END


 
RWolf ©   (2010-05-31 09:29) [18]


> как Вам всегда удается точку с запятой не ставить там, где
> ее можно не ставить?

я тут у кого-то видел код, где точки с запятой стояли даже после begin.


 
12 ©   (2010-05-31 09:34) [19]

дык я знаю, просто как об этом можно всегда помнить?!
ваш покорный, например, на автомате ; после строки ставит..


 
Омлет ©   (2010-05-31 09:59) [20]

Раньше винчестеры были небольшие, приходилось байты экономить ))


 
RWolf ©   (2010-05-31 10:50) [21]


> 12 ©   (31.05.10 09:34) [19]

это потому, что вы воспринимаете точку с запятой, как завершение оператора, тогда как она — разделитель.


 
RWolf ©   (2010-05-31 10:54) [22]

впрочем, точка с запятой в конце каждого оператора таки удобнее — дописывая новую строку перед end, не нужно возвращаться на предыдущую, чтобы поставить запятую.


 
Anatoly Podgoretsky ©   (2010-05-31 11:50) [23]

> 12  (31.05.2010 09:34:19)  [19]

И перед ELSE?


 
Anatoly Podgoretsky ©   (2010-05-31 11:51) [24]

> RWolf  (31.05.2010 10:54:22)  [22]

Провоцируешь? На holly war


 
Loginov Dmitry ©   (2010-05-31 11:53) [25]

Дельфяк точку с запятой сам дописывает. Так нафига ее удалять? :)


 
12 ©   (2010-05-31 11:57) [26]


> Anatoly Podgoretsky ©   (31.05.10 11:50) [23]
>
> > 12  (31.05.2010 09:34:19)  [19]
>
> И перед ELSE?

часто :)
потом стираю


 
Омлет ©   (2010-05-31 12:11) [27]

Кстати, зачем перед else нужна ; ?
В javascript, php и т.п. мешает паскалевская привычка не ставить ; перед else.


 
Омлет ©   (2010-05-31 12:13) [28]

> Кстати, зачем перед else нужна ; ?

Читать так: почему в Паскале перед else не должно быть точки с запятой.


 
12 ©   (2010-05-31 12:22) [29]

логическое условие отделяется ?


 
Anatoly Podgoretsky ©   (2010-05-31 12:28) [30]

> Омлет  (31.05.2010 12:13:28)  [28]

Так Вирт решил, раньше и перед END нельзя было, а в какой то версии TP это
ограничение сняли и теперь не совсем логично.


 
grammar-nazi   (2010-05-31 14:52) [31]


> Так Вирт решил, раньше и перед END нельзя было, а в какой то версии TP это
> ограничение сняли и теперь не совсем логично.


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



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

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

Наверх




Память: 0.54 MB
Время: 0.07 c
15-1264404182
Polkin
2010-01-25 10:23
2010.08.27
ЗАГС - вопросы


15-1267567565
Delphi5.01
2010-03-03 01:06
2010.08.27
Редакт. настр. прокси для Firefox и Opera (решение оплачивается)


15-1275455248
ZeroDivide
2010-06-02 09:07
2010.08.27
Как работают подобные устройства?


6-1224492803
Поросенок Винни-Пух
2008-10-20 12:53
2010.08.27
gprs modem + sms


15-1272520445
капо
2010-04-29 09:54
2010.08.27
Как прокачать sql экспириенс?