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

try .... except 的精簡之法

答題得分者是:Justmade
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-13 14:08:50 IP:61.66.xxx.xxx 未訂閱
請問各位!    如下的程式    
procedure 1
begin
try
   description action1
   try 
      description action2
      try
         description action3
      except
         .....
      end;
   except
      ....
   end;    except
   ....
end;
end;    procedure 2
begin
try
   description action4
   try 
      description action5
   except
      ....
   end;
except
   ....
end;
end;    
因為action動作很有可能會引發不知名的excption而導致程式中斷, 目前我是用三段的try...except來攔截, 有沒有用一個try...except就 可以把程式中當發生exception的情況都攔下來, 同時傳到 E.Message中 讓我可以顯示給客戶看 如達到以下的功能
try
   description action1
   .....
   description action2
   .....
   description action3
   .....
   description action4 ?
   .....
   description action5 ?
   .....
excpet
   .....
end;
ps:1.action1,2,3,4,5分別表示一大段的程式碼, 而且可能在不同的 procedure 或function之內 2.我曾嘗試掛一個Applicaiton Events的vcl進來, 然後在oncexeption的位置 加入錯誤的處理程式, 但程式仍然會當出(不一定在那一段) 3.本案不在於討論action如何會當出, 而是主要目的在可否把只要一個excption 就可以攔下來交由我寫的程式來處理
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-13 14:52:19 IP:203.73.xxx.xxx 未訂閱
P.D 你好: 請參考以下的連結文章
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-13 16:03:36 IP:211.21.xxx.xxx 未訂閱
就我的認知try...except...end不管在try底下有幾行,只要有一行錯誤就不會繼續執行而會跳到except底下去執行,所以您當然可以簡化成為:
try   
  description action1  
   .....
  description action2   
   .....  
  description action3
   .....  
  description action4 ?
   .....   
  description action5 ?   
   .....
excpet
   .....
end;
所以當程式執行到action2有錯時,就不會繼續執行action3,action4,action5...就算action3,action4,action5有錯誤,也只會發生action2的錯誤。 如果您想知道您錯在那一個action時,那您可以用一個變數去記錄,如下所示:
var
  aStep: Integer;
begin
  try
    aStep := 1;   
    description action1  
     .....
    aStep := 2;   
    description action2   
     .....  
    aStep := 3;   
    description action3
     .....  
    aStep := 4;   
    description action4 ?
     .....   
    aStep := 5;   
    description action5 ?   
     .....
  excpet
    case aStep of
     .....
    end;
  end;
end;
這樣就可以知道您錯在那一個了!
~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-14 16:47:02 IP:61.66.xxx.xxx 未訂閱
channel 兄, 你有點誤解我的意思了,     我再舉例    
procedure A1;
begin
  try
  except
  end;
end;    procedure A2;
begin
  try
  except
  end;
end;    function A3;
begin
  try
  except
  end;
end;
以上三個proceudre, function, 我必須寫三個try...except 可否只變成一個, 像以前在學base, 或 clipper 等都有提供 在程式首行宣告 on Error ..... 就好了, 其他只要exception發生, 自動要 on Error 後指定的程式來執行, 也可以再由exception中指定再回來原錯誤發生的 下一行起繼續執行, 我覺得這十分好用, 否則像我程式中用上上千個 procedure, function, 那要寫上上千行無謂的指令, 編譯出來的檔也 大的嚇人! 至於 RaynorPao所指點的幾個資料來源頗多, 我得花點時間消耗, 謝謝!
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-14 17:45:44 IP:218.16.xxx.xxx 未訂閱
原來是clipper時代的舊戰友,呵呵。clipper的語法我都忘得八八九九了。最懷念的就是強大的 Array,唉, Delphi 的 Array 真是夠差的。    Delphi 的 exception 是很物件導向和階層式的。簡單來說,當一個程序發出exception,Delphi 就會跳過餘下的句式而返回呼叫該程序的地方,跳過餘下的程序並看看有沒有 exception handler (就是 try - except 的except部份),若有就執行並消除 exception (除非你再 rasie 它),沒有就再返回呼叫該程序的地方,跳過......直到 Application 物件為止。若還是沒有處理的話,就跳出那個預設的 Messagebox 了。    由於架構是層層相關的,所以你可以在任一層設置 exception handler 去處理其下層發生的 exceptions.  所以,你可以在很高層的地方設下一個總的 exception handler 去處理所有以後發生的 exception.  例如,價設你想在一處處理所有 Form1 裡發生的 exception 你可以
  with Form1.create(self) do
  try
    try
      show();
    except
       on XXXException do.....
    end
  finally
    free;
  end;
這樣,所有在 Form1 (或Form1呼叫的東東) 發生的 exception, 都可在這一併處理了。 但注意: 1. 這樣你只會知道是那個類型的 exception 而不知在那裡發生 2. 由於你的處理程序不在 Form1, Form1 的 private 變數等東東你是用不到的。 所以在Delphi 的 exception 架構中,在合適的地方架設處理程序是很重要的,基本上除了那些你不想特別處厘的 exceptions 外,是不大可能有一個誇程序的 expception 處理方法的。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-15 02:48:50 IP:61.66.xxx.xxx 未訂閱
真好, 又遇到一個clipper的戰友, 不過"舊"這個字我可不太同意哦! 因為有不少Delphi, SQL 在database無法做到的功能, 在clipper上都沒有問題, 就如你提的Array, Marco等, 我到目前還有十數家客戶是我的clipper 程式在跑, 有人事系統, 薪資系統, 財團法人用的等等, 我問他們有沒有興趣 換windows程式, 一律回答沒興趣, 害我都沒有進帳! 言歸正傳, 像你提到在form 上建立try...except , 如果我是在一個form上應該是就解決了, 但我目前的寫法是dll, 所以有可能會call不少層, 所以我才想說如果能一次解決就好了, 不過綜合各方面的資訊, 看來是不太可能做的到, 那可能還是回到原來的做法, 在重點部份(會極有可能常發生excpetion的位置)掛上, 不過RaynorPao兄建議我看的那幾篇資訊我還沒有空可以看, 或許可以從中找到新解答, 如果有新消息, 我會再post上來!
系統時間:2024-05-15 7:48:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!