Делфи ошибка 105

Luchfan123

0 / 0 / 0

Регистрация: 29.03.2014

Сообщений: 16

1

25.05.2014, 12:53. Показов 6234. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
unit U8_2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  f:text;
  s:string;
 
  implementation
 
{$R *.dfm}
 
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 AssignFile(f, 'Pogrebnyak.txt');
 Rewrite(f);
 Reset(f);
 Writeln(f,s);
 CloseFile(f);
end;
 
end.

Я пишу название файла в первое текстовое поле,нажимаю на кнопку «Создание»,но мне выдает ошибку I/O Error 105.Подскажите,пожалуйста,где здесь ошибка?



0



2 / 2 / 0

Регистрация: 25.09.2012

Сообщений: 148

25.05.2014, 13:18

2

f:textfile;

Вот так надо.



0



0 / 0 / 0

Регистрация: 29.03.2014

Сообщений: 16

25.05.2014, 13:20

 [ТС]

3

Не помогает.Выдается та же самая ошибка



0



droider

Эксперт Pascal/Delphi

4891 / 2761 / 851

Регистрация: 04.10.2012

Сообщений: 10,062

25.05.2014, 13:35

4

Delphi
1
2
3
4
5
6
7
8
9
10
var
f:TextFile;
s:string;
begin
AssignFile(f, Edit1.Text);  //задаем в текстовом поле путь к файлу с расширением
s :='Тестовая строка';
Rewrite(f);  //создаем файл
Write(f, s); //записываем в него строку
CloseFile(f); //закрываем файл
end;

Либо еще проще

Delphi
1
FileCreate(Edit1.Text); //создаем пустой файл c заданным именем и расширением



1



Luchfan123

0 / 0 / 0

Регистрация: 29.03.2014

Сообщений: 16

25.05.2014, 14:01

 [ТС]

5

Получилось!Спасибо большое!

Добавлено через 22 минуты

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Button1Click(Sender: TObject);
begin
 AssignFile(f, Edit1.Text);
 Rewrite(f);
  if FileExists(s) then
  begin
  AssignFile(f,s);
   Reset(f);
  end;
 Write(f,s);
 CloseFile(f);
end;

В общем пишу функцию,ели файл существует его открыть его,но почему то он у меня создается по-новому,что здесь не так?



0



droider

Эксперт Pascal/Delphi

4891 / 2761 / 851

Регистрация: 04.10.2012

Сообщений: 10,062

25.05.2014, 16:35

6

Luchfan123,

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
begin
 AssignFile(f, Edit1.Text);
  if FileExists(Edit1.Text) then
  begin
   Reset(f);
  end
  else
  begin
  Rewrite(f);
 Write(f,'Мой текст');
  end;
 CloseFile(f);
end;



1



0 / 0 / 0

Регистрация: 29.03.2014

Сообщений: 16

26.05.2014, 02:22

 [ТС]

7

Получилось!А функцию закрытия файла нужно прописать только одной строкой?: CloseFile(f);?Или что то нужно еще добавить?



0



пофигист широкого профиля

4658 / 3093 / 854

Регистрация: 15.07.2013

Сообщений: 17,841

26.05.2014, 02:51

8

Цитата
Сообщение от Luchfan123
Посмотреть сообщение

А функцию закрытия файла нужно прописать только одной строкой?: CloseFile(f);?Или что то нужно еще добавить?

Одной строки достаточно.



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

26.05.2014, 02:51

Помогаю со студенческими работами здесь

Error 105
Доброго дня суток! Делал прогу, вроде все правильно, вот код:
program Project2;

uses

I/o error 105
Из-за чего может быть эта ошибка? У меня на компе всё работает, но другу скидываю у него это i/o…

Пресловутая I/O error 105
Доброго времени суток, форумчане!
Заранее просьба не ругаться, ибо автор крайне плохо знает…

Опять I/O Error 105
program ProjectX;

uses
Windows,
SysUtils;
type
telem=Integer;
tlist=^Node;

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

8

I currently have a question for Delphi.Every time when i want to run the program it shows me this problem:Runtime error 105 at 0040423F. Here is the picture of it and the program behind it:

ERROR PICTURE

MrTux's user avatar

MrTux

32.1k30 gold badges108 silver badges146 bronze badges

asked Nov 20, 2015 at 21:26

LuXuS's user avatar

Edit your source code to add the line shown below:

program sss;

{$APPTYPE CONSOLE}
   [etc]
  readln()  // <- the program will pause here until you press the Return key
end.

The error you were getting was to tell you your program was being denied access to the standard output stream, which is where the output from a writeln() statement is written, because it isn’t open for output.

answered Nov 20, 2015 at 21:32

MartynA's user avatar

MartynAMartynA

30.4k4 gold badges31 silver badges72 bronze badges

4

105 Error is you are doing a «Console Output» in a GUI App!

Also note: Alexandria v11.2 has the same stupid bug!
enter image description here

FASTMM4.PAS is doing a Writeln() — So you should not feel bad, when the developers of the compiler do the same Delphi 101 Error!!

To Embaradero: DUMBASSES!

answered Sep 20, 2022 at 21:29

Ozz Nixon's user avatar

Ozz NixonOzz Nixon

1491 silver badge7 bronze badges


Форум программистов Vingrad

Модераторы: Poseidon, Snowy, bems, MetalFan

Страницы: (2) [Все] 1 2 
( Перейти к первому непрочитанному сообщению )

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> IO Error 105, как избавиться 

:(

   

Опции темы

Штабс
Дата 14.12.2004, 16:20 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Пипл срочно надо избавиться от этой ошибки

код вроде верный

try

AssignFile(f, FileName);
Reset(f);
except
Rewrite(f) ;
end;

Файл существует
но на любую попытку скинуть в него хоть что то мессадже

IO Error 105

что не так?!

  Вверх
Bes
Дата 14.12.2004, 16:23 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7

Подожди, т.е. теоретически возможна команда ReWrite без Assign-а?…
Это ли не ошибка?
Тем более если файл существует, то он откроется для чтения и понятно, что писать он в себя ничего не дает это ошибка два.

PM MAIL   Вверх
Штабс
Дата 14.12.2004, 16:46 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Ой прошу пардону

AssignFile(f, FileName);
try
Reset(f);
except
Rewrite(f) ;
end;

Rewrite() отрабатывает

ругань конкретно идет на WriteLn(f,BlaBlaBlaBlaBlaBlaBla) при Reset(f) при пошаговой трассировке F8

напоминаю 105 ошибка это невозможность открыть файл для записи

AssignFile(f, FileName) OK
try OK
Reset(f); OK
except OK

структура отработала (т.е. существующий файл получил указатель и открыт для работы)

WriteLn(f,BlaBlaBlaBlaBlaBlaBla)

IO Error 105

PS кстати аналогичное построение с $I- …. $I+ результат аналогичный

  Вверх
Bes
Дата 14.12.2004, 17:23 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7

Че-то я не пойму:
что за конструкция, для чего она, или я чего-то не понимаю или она лишена логики. т.е. программа должна попробовать открыть файл для чтения и если не получилось то открыть для записи….? Странно как-то это.

try
Reset(f);
except
Rewrite(f) ;
end;

а почему отрабатывает Rewrite(f) ; т.е. для чтения он открытьсяне может?
а для записи может?…..

далее WriteLn(f,BlaBlaBlaBlaBlaBlaBla)
BlaBlaBlaBlaBlaBlaBla-это переменная или имеется ввиду WriteLn(f,’BlaBlaBlaBlaBlaBlaBla’)?

Мне кажется но все-таки открывается для чтения и ругается при попытке записать что-либо в него, что вообщем-то естественно.

PM MAIL   Вверх
devmstr
Дата 14.12.2004, 17:46 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Developer
**

Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: 2
Всего: 11

Если хочешь писать пиши:

Код

AssignFile(f, FileName);

Rewrite(f);

write(f, '.....');
end;

[s]

———————

Think different ©Steve Jobs 
user posted image

PM MAIL WWW   Вверх
Vit
Дата 14.12.2004, 18:01 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Vitaly Nevzorov
****

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

f — какого типа?

———————

With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru

PM MAIL WWW ICQ   Вверх
Zero
Дата 15.12.2004, 02:00 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24

Собственно по ошибкам в/в, можно исп. дерективы компилятора {$I-} и {$I+}
Добавлено @ 02:05

Цитата(Vit @ 14.12.2004, 18:01)
f — какого типа?

Имхо, тип здесь не играет особой роли…

PM MAIL ICQ   Вверх
Vit
Дата 15.12.2004, 03:06 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Vitaly Nevzorov
****

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

Цитата(Zero @ 14.12.2004, 17:00)
Имхо, тип здесь не играет особой роли…

Считаешь что мне делать нечего?

———————

With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru

PM MAIL WWW ICQ   Вверх
Vit
Дата 15.12.2004, 03:24 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Vitaly Nevzorov
****

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

Ошибка в общем-то проста и очевидна, я не зря про тип спрашивал, не совсем был уверен, хотя и догадывался откуда ноги растут, сейчас добрался до Дельфи проверил…

Вот код:

Код

 var f:TextFile;
begin
 AssignFile(f, 'c:myfile.txt');
 Reset(f);
 write(f, 'sssss');
end;

Если этот код запустить, и файл ‘c:myfile.txt’ существует, то получим эту самую ошибку 105. Почему? До потому что reset не открывает текстовые файлы на запись! только на чтение. Для записи текстовый файл должен быть открыт только rewrite или append. Вот и все проблемы!

———————

With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru

PM MAIL WWW ICQ   Вверх
Bes
Дата 15.12.2004, 07:27 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7

Об чем и говорим на каждом собрании… :-)

PM MAIL   Вверх
Штабс
Дата 16.12.2004, 13:20 (ссылка)
   |    (голосов: 0)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Unregistered

Только что вернулся от заказчика….
прошу извинить за долгое молчание

и так
тип файла
My_File:TextFile
т.е. текстовой

Директивы компилятора {$I} позволяют отлавливать Error Code
2: Файл не найден
3: Неверное имя
4: Слишком много открытых файлов
5: Файл не доступен
100: Достигнут конец файла (EOF)
101: диск переполне
106: ошибка ввода

105 относится к расширенной таблице ошибок

Если этот код запустить, и файл ‘c:myfile.txt’ существует, то получим эту самую ошибку 105. Почему? До потому что reset не открывает текстовые файлы на запись! только на чтение. Для записи текстовый файл должен быть открыт только rewrite или append. Вот и все проблемы!

спасибо VIT
большое
но насчет очевидности
smile
я к примеру не знал этого ….
хотя стаж еше с TP4
еще раз большое спасибо

  Вверх
Vit
Дата 16.12.2004, 14:13 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Vitaly Nevzorov
****

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

Цитата
но насчет очевидности

я к примеру не знал этого ….
хотя стаж еше с TP4

smile У меня опыт больше! Я с TP3 smile

———————

With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru

PM MAIL WWW ICQ   Вверх
devmstr
Дата 16.12.2004, 19:47 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Developer
**

Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: 2
Всего: 11

Vit
Приятно, когда тебя окружают такие проффесионалы! smile

———————

Think different ©Steve Jobs 
user posted image

PM MAIL WWW   Вверх
Zero
Дата 17.12.2004, 23:34 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24

Цитата(Vit @ 15.12.2004, 03:06)
Считаешь что мне делать нечего?

Извени Vit, нехотел тебя обидеть, до меня и до самого сразу недошло что от типа многое зависит, покрайней мере в данном случае…
Просто мне обычно когда требется избавится от ошибок в/выв, то на ум всегда первое что приходит ─ отключение на их проверку, а дальше что-нибудь ещё предумывать приходится…
Ещё раз, извени…

Это сообщение отредактировал(а) Zero — 17.12.2004, 23:35

PM MAIL ICQ   Вверх
Vit
Дата 19.12.2004, 05:00 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Vitaly Nevzorov
****

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

Цитата(Zero @ 17.12.2004, 14:34)
Ещё раз, извени…

smile Не страшно, сам такие ляпы делаю систематически smile

———————

With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru

PM MAIL WWW ICQ   Вверх
кварк
Дата 20.12.2004, 14:32 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 91
Регистрация: 2.8.2002

Репутация: нет
Всего: нет

Извините, что вcтреваю, но зачем Assign?

tf: TextFile;

{$I-}
Reset(tf,’C:temp.out’);
{$I+}
If IOResult <> 0
then // Не открыт
else // Открыт

Rewrite — то же самое. Аррend’у почему-то нужен assign.

P.S. Всегда был в этом уверен, только что полез в справку и не нашел упоминаний об этом. Но работает еще с ТР: у меня даже в шаблон это забито :-)

P.P.S.
Кстати, try..except эти функции не ловятся. Только через IOResult. Очень уж они старые. Хотя, не исключено, что их переписали «на новый лад».

Это сообщение отредактировал(а) кварк — 20.12.2004, 14:35

PM MAIL   Вверх



















Страницы: (2) [Все] 1 2 

Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Общие вопросы»
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

Go Up to Delphi Compiler Errors Index

I/O (input-output) errors cause an exception to be thrown if a statement is compiled in the {$I+} state. (If the application does not include the System.SysUtils unit, the exception causes the application to terminate).

Handling I/O Errors

In the {$I-} state, the program continues to execute, and the error is reported by the IOResult function.

I/O Error List

The following table lists all I/O errors, numbers, and descriptions.

Number

Name

Description

100

Disk read error

Reported by Read on a typed file if you attempt to read past the end of the file.

101

Disk write error

Reported by CloseFile, Write, WriteIn, or Flush if the disk becomes full.

102

File not assigned

Reported by Reset, Rewrite, Append, Rename, or Erase if the file variable has not been assigned a name through a call to Assign or AssignFile.

103

File not open

Reported by CloseFile, Read Write, Seek, Eof, FilePos, FileSize, Flush, BlockRead, or BlockWrite if the file is not open.

104

File not open for input

Reported by Read, Readln, Eof, Eoln, SeekEof, or SeekEoln on a text file if the file is not open for input.

105

File not open for output

Reported by Write or Writeln on a text file if you do not generate a Console application.

106

Invalid numeric format

Reported by Read or Readln if a numeric value read from a text file does not conform to the proper numeric format.

See Also

  • Exception Handling
  • Resolving Internal Errors (Delphi)
  • Delphi Run-Time Errors
  • Fatal errors
  • Operating system errors

Delphi • Консоль • Программирование • Программистские истории

История одной ошибки

Недавно я столкнулся с интересным случаем. Ребята из подразделения эксплуатации завели в mantis тикет, описывающий сценарий работы одной из программ, который не укладывался в их понимание правильной картины мира. С моей точки зрения все выглядело немного сумбурно и не очень логично. В общем, опишу немного саму ситуацию и предысторию.

Программа, которая вызвала нарекания, была написана давно, еще на заре автоматизации компании, в которой я сейчас работаю. Она была предназначена, если уж совсем упрощать, для перекладывания файлов. Ну, то есть, пользователи выкладывали файлы в определенные каталоги. Эти файлы надо было обнаружить, систематизировать, основываясь на определенным образом составленных именах файлов, в зависимости от результата систематизации обработать, например, подписать, и выложить на FTP, попутно создав в БД записи об обработанных файлах. Все это делалось для того, чтобы другой софт, используя записи в БД, мог генерировать странички, которые показывались пользователям, и, в случае необходимости, отдавать содержимое с FTP сервера.

Изначально, часть этой работы выполнял shell-скрипт, но, как это обычно и бывает, постепенно возникали все новые и новые «хотелки», и, в конце концов, скрипт переписали на Delphi 6. Заодно, запихали в БД нормативно-справочную информацию и создали программу для работы с ней. Правда, при этом потребовали от этой программы и GUI интерфейс и возможность выполняться в качестве консольного приложения. Дело в том, что программу использовали два типа пользователей: первые — обычные работники, которым нужен был графический пользовательский интерфейс; вторые — сотрудники службы эксплуатации, которые хотели продолжать использовать программу в режиме «малой» автоматизации, примерно так, как раньше использовался shell-скрипт. Этим вторым GUI только мешал. Поэтому автору пришлось пойти на хитрость. Он указал, что приложение является консольным (выставив соответствующую опцию ConsoleApp=1). И при этом, не стал отказываться от инициализации визуального фреймворка (далее идет код из dpr файла):

begin
  Application.Initialize;
  Application.Title := 'Название программы';
  Application.CreateForm(TdmMain, dmMain);
  Application.CreateForm(TfmMain, fmMain);
  Application.Run;
end.

Если при запуске обнаруживались параметры командной строки, на экране не показывались окна, диалоги и другие элементы графического интерфейса, просто в обработчике OnCreate главной формы выполнялся нужный метод (btnPublish.Click;) и работа завершалась.

    if SilentRun then begin
      btnPublish.Click;
      WriteToLog('END');
      Application.Terminate;
    end;

При этом, программа отслеживала возникновение ошибок, и, при их отсутствии, завешалась с кодом 0, в противном случае, выставляла код 1. Такая вот задумка.

Но, довольно истории, вернемся к возникающей ошибке, вернее, к ошибкам. Это именно то, что и смущало меня: работники службы эксплуатации сообщали о двух разных ошибках: одна — socket error #11002, а другая — I/O error 105. Первая — про невозможность доступа к FTP, вторая — про попытку писать в файл, открытый для чтения. И да, сообщали об этих ошибках разные люди.

Для начала, я решил выяснить, почему одни сотрудники сообщают об обычной ошибке, возникающей при работе с FTP, а другие ссылаются на совершенно другую ошибку, к FTP, скорее всего, отношения не имеющую? После долгих расспросов выяснилось, что каждый из этих сотрудников смотрит в свой лог. Оказалось, что программа ведет три лога: один — в БД, второй (очень похожий на первый по содержанию) ведется в памяти, а по завершении работы отправляется по почте, и третий — ведется в обычном текстовом файле. Так вот, те сотрудники, которые сообщали об ошибке ввода/вывода, смотрели в лог, присланный по почте, а те, которые жаловались на ошибку при работе с FTP, смотрели в лог, ведущийся в текстовом файле.

Тут важно сделать следующее замечание. Основная претензия службы эксплуатации заключалась в том, что, несмотря на возникновение ошибки, программа завершалась самым обычым образом, устанавливая код ошибки (ERRORLEVEL) в 0. А так как программа вызывалась из скрипта, который анализировал код завершения, то получалось, что скрипт продолжал работу, как-будто ошибка не происходила вовсе. Хотя и программа и скрипт были расчитаны на то, что при возникновении критических ошибок, работа программы должна была прерываться с кодом 1.

Ладно, глаза боятся, руки делают — стал я изучать исходный текст, программа-то не моя. Тактика была простой: найти места, выдающие ошибки. Довольно быстро выяснилось, как выдается ошибка работы с FTP. Ошибка возникала практически сразу при старте: делалась попытка подключения к серверу, а так как эксплуатация указала для этого неверные данные, то подключение срывалось, продолжение работы становилось бессмысленным, о чем и сообщалось записью в текстовый лог, после чего выполнение прерывалось вызовом процедуры Delphi Halt(1);.

...
if SilentRun then
          MyHalt('Ошибка подключения к FTP-серверу '+ edtFTPServerTo.Text+':'+#10+e.Message)
        else
          ErrorBrk('Ошибка подключения к FTP-серверу '+ edtFTPServerTo.Text+':'+#10+e.Message);
...
procedure TfmMain.MyHalt(msg: String);
begin
  MyWriteln(msg);
  SendMail(resError);
  ASP_LogEvent('', cProgName, 'Publish', ASP_logTypeGUI, ASP_logSeverityError, msg, msg, '');
  Halt(1);
end;
...

Логика проста и понятна. Но откуда бралось сообщение об ошибке ввода/вывода в логе из электронного письма?

Продолжение исследования выявило тот факт, что такого текста I/O error 105 для логирования ошибок в программе не предусмотрено. Этот факт позволил сделать предположение, что в исходном тексте есть место, которое перехватывает необработанные исключительные ситуации, и логирует их текст «как есть». И действительно, такое место нашлось, и, что самое интересное, после логирования и отправки письма, работа программы не прерывалась вызовом процедуры Halt, выполнение просто заканчивалось как ни в чем не бывало!

...
except
    on e: exception do begin
      regexp.Free;
      keys.Free;
      if IdFTP.Connected then IdFTP.Disconnect;
      IdFTP.Free;
      if UserCanSign then
        CryptoCOM := nil;
      ASP_LogEvent('', cProgName, 'Publish', ASP_logTypeGUI, ASP_logSeverityError, e.Message, e.Message, '');
      DisableStop;
      MemoLog({FormatDateTime('dd.mm.yyyy hh:nn:ss', Now) + ': }'Ошибка: ' + e.Message);
      PrintTotals;
      SendMail(resError);
    end;
  end;
...

То есть, был найден источник головной боли эксплуатации — неправильная установка кода завершения программы. Оставалось выяснить, почему вообще дело доходило до этого места, ведь значительно раньше должна была выполниться процедура Halt.

Код, который производил логирование в текстовый файл, а потом вызывал процедуру Halt, имел еще одну особенность. Между этими двумя действиями он выводил информацию об ошибке в консоль — обычным writeln.

...
procedure TfmMain.MyWriteLn(msg: String);
var TextOEM: PChar;
begin
  WriteToLog(msg);
  GetMem(TextOEM, Length(msg) + 1);
  try
    CharToOem(PChar(msg), TextOEM);
    Writeln(TextOEM);
  finally
    FreeMem(TextOEM);
  end;
end;
...

При этом, вызов этой процедуры осуществлялся только в режиме без GUI — присутствовали все необходимые проверки. То есть, единственным местом, в котором могла возникнуть исключительная ситуация, был вывод в консоль (на самом деле, это, конечно, не единственный возможный источник, но для других выводились бы более явные ошибки). Если бы именно тут и происходила ошибка, то процедура Halt не выполнялась бы, управление передавалось в блок обработки исключительных ситуаций, там формировалось бы сообщение об ошибке, которое, вместе с остальным журналом работы, и посылалось бы в письме. Идеальный кандидат найден. Теперь осталось понять, что это за зверь такой: ошибка ввода/вывода 105.

Непродолжительный поиск в интернете практически сразу вывел на схожую проблему у одного из пользователей Stack Overflow. Из обсуждения стало понятным, что проблема кроется именно в «двуличной» природе программы — попытка предоставить и GUI интерфейс, и дать возможность работать в качестве обычного консольного приложения, к сожалению, не удалась. Все в соответствии с пословицами и поговорками. Для меня осталось загадкой лишь то, как могла данная ошибка вылезти только что, после стольких лет эксплуатации. Ведь наверняка это был не первый случай проблем с коннектом к FTP серверу. Скорее всего, такие сбои происходили и раньше, но либо в их природе так и не смогли (не захотели?) разобраться, либо просто игнорировали. Либо что-то, все-таки, отличало данный конкретный случай от многих других. Но то нам не ведомо.

Ну и, подводя черту. Понимая, что полной реализации желаемого функционала «два в одном» не получится, я предложил эксплуатации несколько вариантов выхода из сложившейся ситуации. Посмотрим, какой они выберут. Так что, возможно, я еще вернусь к этому интересному случаю и расскажу, чем дело кончилось.

Subscribe to Записки на полях

Get the latest posts delivered right to your inbox

Great! Check your inbox and click the link to confirm your subscription.

Please enter a valid email address!

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Делфи ошибка 103
  • Делта частотник ошибки
  • Делонги ошибка вставьте заварочный узел
  • Делонги неспрессо ошибки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии