2011-12-12 5 views
6

मैं पुरानी शैली पास्कल आई/ओ दिनचर्या का उपयोग कर रहा है और कहा कि मैं/हे कार्यों कि असफल एक 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. 

उत्तर

8

अपवाद अगर मैं/हे जाँच सक्षम है EInOutError केवल बढ़ा दी जाएगी।

  • अपनी परियोजना विकल्प में, "डेल्फी संकलक विकल्प" में चेकबॉक्स आई/ओ जाँच
  • किसी भी {$ IOCHECKS बंद} निकालें या {$ मैं जाँच: यकीन है कि यह सक्षम किया गया है निम्न कार्य करने के लिए -} आपके कोड से निर्देश I/O चेकिंग

यदि फ़ाइल मौजूद नहीं है तो यह आपको उचित अपवाद देनी चाहिए।

अब अगर (जो भी कारण के लिए) आप आई/ओ जाँच सक्षम नहीं कर सकते:

विकलांग के साथ आई/ओ जाँच आप एक EInOutError नहीं मिलेगा कुछ गलत हो जाता है। इसके बजाय आपको प्रत्येक I/O ऑपरेशन के बाद IOResult का मान देखना होगा। यह पुराने पास्कल समय की तरह है: यदि IOResult <> 0 तो एक त्रुटि हुई।

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 उपयोग करने के लिए उपयोग करना चाहिए/फ़ाइलें बना सकते हैं और अब पुरानी शैली पास्कल दिनचर्या का उपयोग नहीं करते: यह (थोड़ा अनुकूलित) Delphi docs से अंश कैसे IOResult के साथ काम करने को दर्शाता है। इस कैसा नज़र आ सकता एक उदाहरण:

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); 
+0

नहीं। इसे देखकर "अपवाद काम नहीं करते हैं और मुझे नहीं पता क्यों"। –

+0

मैंने इसे कम ध्वनि बनाने के लिए संपादित किया जैसे कि मैं उन्हें टॉगल करने की अनुशंसा करता हूं। –

+0

ठीक है लेकिन fmCreate फ़ाइल सामग्री मिटा देगा। –

5

मैं अपने प्रश्न है कि आप EInOutError अपवाद चाहते हैं व्याख्या उठाया जा जब भी कोई पास्कल शैली आई/ओ समारोह में विफल रहता है। ऐसा करने के लिए आपको I/O checking compiler option को सक्षम करने की आवश्यकता है।

आई/ओ जाँच: सक्षम या स्वत: कोड पीढ़ी है कि एक आई/ओ प्रक्रिया के लिए एक कॉल के परिणाम की जाँच करता है अक्षम करता है। किसी I/O प्रक्रिया एक अशून्य आई/ओ परिणाम देता है तो जब यह स्विच चालू है, एक EInOutError अपवाद उठाया है (या कार्यक्रम समाप्त हो जाता है, तो अपवाद हैंडलिंग सक्षम नहीं है)। जब यह स्विच बंद हो जाता है, तो आपको IOResult को कॉल करके I/O त्रुटियों की जांच करनी होगी।

मैं कोड आप के साथ इस धारणा है कि मैं/हे विकल्प को चेक सक्षम किया गया था के तहत लिखा गया था काम कर रहे हैं लगता है, लेकिन है कि आप इसके साथ संकलन कर रहे हैं सक्षम नहीं। यहाँ कोड है कि EInOutError दर्शाता है किसी I/O त्रुटि के कारण उठाया जा रहा का एक सा है।

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 जांच सक्षम करें। यह आपको अपने शेष कोड के अनुरूप अपवादों का उपयोग करके त्रुटियों को संभालने की अनुमति देगा।

आप हर आई/ओ समारोह के बाद IOResult के मान की जाँच करने आई/ओ जाँच सैन्य बलों का इस्तेमाल नहीं।यह बहुत त्रुटि प्रवण है (जांचना भूलना आसान है) और परिणामस्वरूप अवांछित कोड में परिणाम।

यदि आप पहले से ही I/O जांच सक्षम हैं, तो आपके लिए त्रुटि देखने में सबसे अधिक संभावित स्पष्टीकरण यह है कि वास्तव में कोई त्रुटि नहीं हो रही है। शायद फाइल वास्तव में मौजूद है।

+1

कोई भी जानता है कि यह क्यों कम हो गया है। मुझे इस प्रश्न पर मतदान को समझने में कठिनाई होनी चाहिए। क्या मैंने इस सवाल को गलत समझा? मैं बस जानना चाहता हूँ। –

+0

+1 आप मुझे किसी भी दिन डेविड व्याख्यान दे सकते हैं। बधाई। :-) – Sam

संबंधित मुद्दे

 संबंधित मुद्दे