Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.061 c
11-1216127473
KOLBOSS
2008-07-15 17:11
2010.08.27
DBF + DBF = DBF?


15-1267353578
Andy BitOff
2010-02-28 13:39
2010.08.27
Использование Linux приравняли к пиратству


2-1267108150
Alex___
2010-02-25 17:29
2010.08.27
Как работать с бестиповой переменной?, func(VAR BUF;...)


15-1262347734
Kerk
2010-01-01 15:08
2010.08.27
Мысли про различия и эволюцию


3-1241656611
Раиса
2009-05-07 04:36
2010.08.27
ADO+dbf - как будут называться функции в select





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