首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi:如何捕捉TStreamWriter磁盘满错误?

Delphi:如何捕捉TStreamWriter磁盘满错误?
EN

Stack Overflow用户
提问于 2020-07-29 22:50:18
回答 1查看 140关注 0票数 0

我想知道,为什么这段代码不能像它应该的那样捕获“磁盘已满”错误?

这一点很重要,因为如果用户没有注意到保存失败,他们可能会丢失数据。

我不明白这个..。

代码语言:javascript
复制
procedure TForm2.Button1Click(Sender: TObject);
var
  Writer: TStreamWriter;
  n : integer;
begin
Writer := TStreamWriter.Create('MyUTF8Text.txt', false, TEncoding.UTF8);
  Try //Finally
    Try //Except
      
      for n := 1 to 1000 do
      begin
        Writer.WriteLine('Testing text writing to the UTF-8 file.');
      end;
    Except
      on E: Exception do
      begin
        ShowMessage('Exception Class name: ' + E.ClassName);
        ShowMessage('Exception Message: ' + E.Message);
      end;
    end; // except
  Finally
    Writer.Free(); 
  End; //finally
end;

“顺便说一句,‘编写器可能没有被初始化’的警告,真的很严重吗?”

编辑:出现此警告是因为TStreamWriter.Create是在尝试之后。谢谢您的建议,我将这行代码更正为(!)试试看。

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 23:21:13

试试这个:

代码语言:javascript
复制
procedure WriteStream;
var
  Writer: TStreamWriter;
  fs: TFileStream;
  s: String;
  n, bytesWritten : integer;
begin
  bytesWritten := 0;
  fs := TFileStream.Create('MyUTF8Text.txt', fmCreate);
  try
    //avoid warning by initiaizing before try
    Writer := TStreamWriter.Create(fs);
    try //Finally
      try //Except
        for n := 1 to 10 do
        begin
          s := 'Testing text writing to the UTF-8 file.'  + '#13#10';
          //keep count of bytes written
          bytesWritten := bytesWritten + TEncoding.UTF8.GetByteCount(s);
          Writer.Write(s);
        end;
        Writer.Flush;
        Writer.Close;
        //Check stream size to make sure all bytes written
        if bytesWritten <> Writer.BaseStream.Size then
          raise Exception.Create(String.Format('Expected %d bytes, wrote %d', [Writer.BaseStream.Size, bytesWritten]));
      except
        on E: Exception do
        begin
          Showmessage('Exception Class name: ' + E.ClassName);
          Showmessage('Exception Message: ' + E.Message);
        end;
      end; // except
    finally
      Writer.Free; // Will only free if it has been constructed
    end; //finally
  finally
    fs.Free;
  end;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63156343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档