全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1310
推到 Plurk!
推到 Facebook!

如何當程式讀到無法解析的資料時,跳到下一行繼續執行

尚未結案
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-23 14:19:10 IP:61.59.xxx.xxx 未訂閱
請問一下: 我現在要分析一個mail 的 log檔, 但是log檔中記錄的subject因轉碼問題呈現亂碼, Delphi在寫入資料庫時,會出現錯誤訊息, 請問!我要如何避免程式abort掉, 因為我還是需要將整個log檔的資料寫入資料庫中, 至於因為亂碼而導致程式出錯的問題,要如何解決呢?
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-23 14:55:35 IP:219.68.xxx.xxx 未訂閱
1. 使用 try-except 方式來處理錯誤, 讓程式繼續往下做
 for i :=0 to MaxCount do
 begin 
   try
     ...
     //Process log
     //Do Database action
     ...
   except on E:Exception do 
     begin
     ...
     ...
     end;
   end;
 end;
2.改用WideString 來處理資料, 建議採用 TntWare 等支援Unicode 的元件 裡面有很多可以取代Delphi 內建的函式, 如 Copy, Pos...等常用函式 3.資料庫中欄位設定為 nChar , nVarChar 等之類的 Unicode 型態 避免無法塞入資料 發表人 - chris_shieh 於 2004/12/23 15:28:39
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-23 14:58:25 IP:203.73.xxx.xxx 未訂閱
提供一些意見給您參考看看 避免程式abort掉 try //寫入資料庫 except on e: Exception do; //忽略錯誤 end; 至於亂碼而導致程式出錯的問題,可能是因為裡面有特殊字元 可以將要寫入的亂碼資料再編碼過,或是把特殊字元過濾過
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-23 16:26:24 IP:61.59.xxx.xxx 未訂閱
if OpenDialog1.execute then Edit4.text:=OpenDialog1.filename; list:=Tstringlist.create; list.LoadFromFile(Edit4.text); for i:=0 to list.count-1 do begin try If temsql.Active Then temsql.Close; temsql.SQL.Clear; temsql.SQL.Add('INSERT INTO MAILBODY (script) VALUES ' '(' Quotedstr(list.strings[i]) ')'); temsql.SQL.text; temsql.ExecSQL; except on E:Exception do ... ... ... End; 不好意思! 我想再問的詳細一點, 我希望程式不abort的目地, 是想要程式跳過無法解析的那一行, 迴圈能跳到下一行繼續從log檔中讀出再寫入資料庫裡, 有解決的辦法嗎? 請不吝指教,謝謝!
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-23 17:22:36 IP:218.167.xxx.xxx 未訂閱
你改的已經可以達到你說的目的了
if OpenDialog1.execute then
begin
   Edit4.text:=OpenDialog1.filename;
   list:=Tstringlist.create;
   list.LoadFromFile(Edit4.text);
   for i:=0 to list.count-1 do
   begin
     try
       If temsql.Active Then
         temsql.Close;
       temsql.SQL.Clear;
       temsql.SQL.Add('INSERT INTO MAILBODY (script) VALUES ' '(' Quotedstr(list.strings[i]) ')');
       tempsql.Execute;//[red] 如果這裡出錯, 會跳至下面區塊處理
     except on E:Exception do
       begin
           ...//處理錯誤訊息
           ...//處理完之後會繼續處理for-loop下一步
       end;
     End;
   end;
end;
PS. 程式碼前後記得加上[ code ] [ /code ] 發表人 - chris_shieh 於 2004/12/23 17:25:55
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-23 17:48:11 IP:61.59.xxx.xxx 未訂閱
為什麼要加上[ code ] [ /code ]呢? 又要加在哪裡?
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-23 17:49:14 IP:61.59.xxx.xxx 未訂閱
為什麼要加上[ code ] [ /code ]呢? 又要加在哪裡? 可是…還是會出現錯誤訊息,程式就停了,怎麼辦呢
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-23 18:26:20 IP:61.59.xxx.xxx 未訂閱
我在except on E:Exception do 處理錯誤程序裡寫了 z:=i; inc(z); 並下了中斷點, 可是…程式並沒有進到處理錯誤程序裡, 這是怎麼一回事?
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-23 18:34:59 IP:218.167.xxx.xxx 未訂閱
是請您在貼程式碼上來時 記得前後加上以利編排 並不是在程式中加入    如果不確定出錯的地方就把try except 包的範圍擴大 或是用F7一步步執行看問題出在那裡 在IDE編輯環境下Exception 會跳出Exception 對話框暫停執行 按下F9可以繼續執行
if OpenDialog1.execute then
begin
   try
     Edit4.text:=OpenDialog1.filename;
     list:=Tstringlist.create;
     list.LoadFromFile(Edit4.text);
   except 
     //是這裡出錯嗎
   end;
   for i:=0 to list.count-1 do
   begin
     try
       If temsql.Active Then
         temsql.Close;
       temsql.SQL.Clear;
       temsql.SQL.Add('INSERT INTO MAILBODY (script) VALUES ' '(' Quotedstr(list.strings[i]) ')');
       tempsql.Execute;//[red] 如果這裡出錯, 會跳至下面區塊處理
     except on E:Exception do
       begin
           ...//處理錯誤訊息
           ...//處理完之後會繼續處理for-loop下一步
       end;
     End;
   end;
end;    
kenspc
一般會員


發表:1
回覆:20
積分:4
註冊:2004-12-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-24 14:54:01 IP:61.6.xxx.xxx 未訂閱
引言: try If temsql.Active Then temsql.Close; temsql.SQL.Clear; temsql.SQL.Add('INSERT INTO MAILBODY (script) VALUES ' '(' Quotedstr(list.strings[i]) ')'); tempsql.Execute;//[red] 如果這裡出錯, 會跳至下面區塊處理 except on E:Exception do begin ...//處理錯誤訊息 ...//處理完之後會繼續處理for-loop下一步 end; End;
給一個建議: try If temsql.Active Then temsql.Close; temsql.SQL.Clear; temsql.SQL.Add('INSERT INTO MAILBODY (script) VALUES ' '(' Quotedstr(list.strings[i]) ')'); tempsql.Execute;//[red] 如果這裡出錯, 會跳至下面區塊處理 except // on E:Exception do 可以省略掉, 反正你的目的是要跳過,不是嗎? //begin 這也可以省略掉 ...//處理錯誤訊息 ...//處理完之後會繼續處理for-loop下一步 //end; 這也可以省略掉 end;
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-24 15:27:06 IP:61.59.xxx.xxx 未訂閱
kenspc : 是的!我就是要跳過, 不過…程式就是會停下來, 不知道為什麼????
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-24 18:21:49 IP:219.68.xxx.xxx 未訂閱
確定程式有進入 for loop? 還是根本在上面就 list load logfile 就出錯? 就程式邏輯而言 就是這樣做沒錯 也許是別的問題?並不出在這一段程式碼 F7一步步執行結果是斷在那裡呢?
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-29 16:44:09 IP:60.248.xxx.xxx 未訂閱
try ... ... temsql.ExecSQL; 錯在這一行 except end; 我在except中是沒寫程式,就算有寫程式,也是不會跳進來 為什麼?為什麼呢?
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-12-29 19:32:00 IP:220.130.xxx.xxx 未訂閱
引言: try ... ... temsql.ExecSQL; 錯在這一行 except end; 我在except中是沒寫程式,就算有寫程式,也是不會跳進來 為什麼?為什麼呢?
你的情況是在哪一種狀況發生的呢? 是直接使用RUN那個按鈕去執行你的程式還是單獨執行程式發生的呢? 若是使用IDE上面的RUN而發生這種情況! 請tools=>debugger options=>language exceptions=>stop on delphi exceptions 將和取方塊取消 < >< > 另外你可以參考這個篇討論
------
Best Regards,
Rex Chiu
gaui
一般會員


發表:25
回覆:36
積分:12
註冊:2004-06-11

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-12-30 10:17:54 IP:60.248.xxx.xxx 未訂閱
rexchiu : 真是太感謝您了, 終於解決了我多日來的疑惑, 原來哦~是因為多了一個屬性, 真的很謝謝你哦!
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-12-30 11:34:59 IP:220.229.xxx.xxx 未訂閱
引言: rexchiu : 真是太感謝您了, 終於解決了我多日來的疑惑, 原來哦~是因為多了一個屬性, 真的很謝謝你哦!
Hi,Gaui: 其實應該感謝的是有Ktop這個地方能讓我們大家多多交流!
------
Best Regards,
Rex Chiu
系統時間:2024-06-22 18:31:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!