我正在使用旧式Pascal I / O例程,并期望对失败的I / O函数的调用会引发EInOutError 当我尝试这个时,我没有看到异常提出,我不知道为什么。

procedure TForm1.Button1Click(Sender: TObject);
//var i: integer;
begin
id:=(strtoint(Edit1.Text)-1)*4;

AssignFile(plik,'\klienci\'+linia_klient[id]+'.txt');
try
Reset(plik);
except
  on EInOutError do Rewrite(plik);
  end;
edit2.Text:=linia_klient[id+1];
edit3.Text:=linia_klient[id+2];
//ListBox1.Clear;
//ListBox1.Items.Add();
end;

整个代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    ListBox1: TListBox;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  plik:TextFile;
  linia_klient,linia_video:array[0..20] of string;
  id:integer;

implementation

{$R *.dfm}
{$IOCHECKS ON}
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
Edit1.Text:='Witaj, Podaj ID klienta';
Label1.Caption:='ID';
AssignFile(plik,'klienci.txt');
Reset(plik);
i:=0;
While Not Eof(plik) do
  begin
    Readln(plik,linia_klient[i]);
    inc(i);
  end;

CloseFile(plik);
AssignFile(plik,'video.txt');
Reset(plik);
i:=0;
While Not Eof(plik) do
  begin
    Readln(plik,linia_video[i]);
    inc(i);
  end;

CloseFile(plik);
end;

procedure TForm1.Button1Click(Sender: TObject);
//var i: integer;
begin
id:=(strtoint(Edit1.Text)-1)*4;

AssignFile(plik,'\klienci\'+linia_klient[id]+'.txt');
try
Reset(plik);
except
  on EInOutError do Rewrite(plik);
  end;
edit2.Text:=linia_klient[id+1];
edit3.Text:=linia_klient[id+2];
//ListBox1.Clear;
//ListBox1.Items.Add();
end;

end.

===============>>#1 票数:8 已采纳

只有在启用 I / O检查时才会引发异常EInOutError 要确保它已启用,请执行以下操作:

  • 在项目选项中,在“Delphi Compiler Options”中选中复选框I / O检查
  • 从代码中删除任何{$ IOCHECKS OFF}或{$ I-}指令,因为它们禁用了I / O检查

如果文件不存在,这应该给你一个适当的例外。

现在,如果(无论出于何种原因)您无法启用I / O检查:

使用禁用的 I / O检查,如果出现问题,您将无法获得EInOutError 相反,您必须在每次I / O操作后检查IOResult的值。 这就像旧帕斯卡时代一样:如果IOResult <> 0则发生错误。 Delphi文档中的这个(略微改编)摘录展示了如何使用IOResult:

  AssignFile(F, FileName);
  {$I-}
  Reset(F);
  {$I+}
  if IOResult = 0 then
  begin
    MessageDlg('File size in bytes: ' + IntToStr(FileSize(F)),
      mtInformation, [mbOk], 0);
    CloseFile(F);
  end
  else
    MessageDlg('File access error', mtWarning, [mbOk], 0);

但是,现在您应该使用TFileStream来访问/创建文件,而不再使用旧式Pascal例程。 这看起来如何:

filename := '\klienci\'+linia_klient[id]+'.txt';
if not FileExists(filename) then
  // "Create a file with the given name. If a file with the given name exists, open the file in write mode."
  fs := TFileStream.Create(filename, fmCreate) else
  // "Open the file to modify the current contents rather than replace them."
  fs := TFileStream.Create(filename, fmOpenReadWrite);  

===============>>#2 票数:6

我解释你的问题,你希望每当Pascal样式I / O函数失败时都会引发EInOutError异常。 为此,您需要启用I / O检查编译器选项

I / O检查 :启用或禁用自动代码生成,以检查对I / O过程的调用结果。 如果在此开关打开时I / O过程返回非零I / O结果,则会引发EInOutError异常(或者如果未启用异常处理,程序将终止)。 当此开关关闭时,您必须通过调用IOResult来检查I / O错误。

我猜你正在使用的代码是在假设I / O检查选项已启用的情况下编写的,但是您正在编译它未启用它。 这里有一些代码可以演示由于I / O错误引发的EInOutError

program IOchecking;
{$APPTYPE CONSOLE}
{$IOCHECKS ON}
uses
  SysUtils;
var
  F: File;
begin
  AssignFile(F, 'path/to/file/that/does/not/exist');
  Reset(F);//raises EInOutError
end.

我强烈建议您启用I / O检查。 这将允许您以与代码的其余部分一致的方式使用异常处理错误。

不使用I / O检查会强制您在每个I / O功能后检查IOResult的值。 这非常容易出错(很容易忘记检查)并导致代码不整齐。

如果您已经在启用了I / O检查的情况下运行,那么最可能的解释是您没有看到错误,实际上没有发生错误。 也许该文件确实存在。

  ask by Błażej translate from so

未解决问题?本站智能推荐:

2回复

我在Pascal中收到括号错误。 怎么了?

下一行 给我错误 找到“(”个预期,但“)个” 怎么了? 谢谢
1回复

Lazarus,无法使DB Update运行。 如何预览正在提交的内容?

嗨,我有一个使用TMySQL51Connection,TSQLTransaction和TSQLQuery模块的表单设置,它从数据库中检索信息没有问题,但是我在更新时遇到了问题。 数据库很大,因此我仅从第一行开始,一旦它们开始工作,我将扩展查询。 我的TSQLQuery.UpdateS
4回复

帕斯卡异常

在Pascal中编写这样的表达式是不合法的: 还是你必须写 我想知道在Pascal,Object或Delphi中,顶部方式是否合法,还是必须在底部使用旧式方法。
2回复

Pascal和Delphi语法错误?

这是inno setup中的代码部分。我的意图是制作两个Checkbox,一次选中一个。 但是此代码返回错误。 [代码]部分: 请告诉我在哪里更改。
2回复

TDownloadURL无法从HTTPS下载

我一直在尝试通过TDownloadURL类创建(TFileStream)PDF,但我真的遇到了从URL获取文件/流的麻烦,特别是如果URL是HTTPS。 我不确定我是否清楚,但我会发布一个片段,这样可能有助于理解: URL属性在HTTP中同样存在于HTTPS中! 但它会抛出一个错
2回复

我可以将指针用于类吗?

我正在使用Delphi XE3。 在研究了Delphi之后 - 维护对象的自引用之后 ,我理解类类型的变量实际上是引用对象的指针。 因此,我编写以下代码来测试它,如下所示: 在我的代码中,使用PMyClass(Item)似乎也得到了对象地址,因为Integer(PMyClass(
1回复

德尔福中的OLE错误805303E?

你好,我正在测试在geckobrowser(Delphi中的gecko组件)中加载html代码的功能。 这里的功能 但是程序显示类型为“ OLE ERROR 805303E8”的错误。 我跟踪执行,发现问题出在行中: domhtmldoc.Write (nsstr.AString)在
2回复

预期语句,但函数代码中发现函数错误

所以下面是我创建的用于验证用户输入是否在范围内的代码模块,但是此错误始终出现在“期望的语句但找到了功能”的下方,有人有想法吗? 非常感谢
1回复

如何在Delphi中进行一次活动?

我是一名入门程序员,我正在尝试使用Delphi Pascal语言制作基于文本的RPG游戏(如Zork)。 我做了一个事件,其中主人公打开箱子并找到一些物品: 但是我想这样一种方式:每当有人在第一次打开箱子后,箱子就会变空,因为玩家已经拿走了物品。 换句话说,当有人第二次在TEdit中
1回复

如何使用SetFilePointerEx转到物理磁盘的末尾?

仅在设置位置时,我已经可以使用SetFilePointerEx了。 两者都起作用; 我可以设置职位,甚至查看我当前的职位。 但是当我根据文档设置FILE_END ,无论第二个参数是什么,以及是否为第三个参数提供一个指针,它都会失败,即使在许多其他操作都可以正常使用的有效句柄上。