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

產生例外狀況程式卻不會中斷

缺席
marlon_wu
一般會員


發表:5
回覆:6
積分:2
註冊:2002-09-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-05 16:55:57 IP:203.204.xxx.xxx 未訂閱
以下為程式片斷, 執行 save 首先檢查可否存檔 (見fCheckIfCanSave) 檢查結果如果日期欄位空白, 引發例外狀況, 但程式執行完 raise Exception.Create('日期不得空白') 後並沒有中斷, 又執行了fCheckIfCanSave 的最後一行 Raise Exception.Create(ErrNoCheckFailRemark) 之後又回到 Save 執行最後一行 ExecSQL(sql, false); 之後Windows Show 出'日期不得空白'的錯誤訊息, 再來出現 EAccessViolation 的及 runtime error 216的錯誤 是那裡出錯? function TtsDutyDayReport.Save(MaxErrors: integer; AutoTran: boolean): integer; var sql, value: string; begin fCheckIfCanSave; Result:=inherited Save(MaxErrors, AutoTran); if (Result = 0) And SaveCheckedStatus then begin if Checked then value:='1' else value:='0'; sql:='UPDATE ' fTableName ' SET ' m_Fields[FI_DD_CHECKED].field_name ' = ' value ' WHERE ' m_Fields[FI_DD_NO].field_name ' = ' '''' No ''''; ExecSQL(sql, false); end; end; procedure TtsDutyDayReport.fCheckIfCanSave; begin if DataSet.FieldByName(m_Fields[FI_DD_DATE].field_name).IsNull then raise Exception.Create('日期不得空白'); if (DataSet.FieldByName(m_Fields[FI_DD_HOTELCOST].field_name).AsFloat > 0) And DataSet.FieldByName(m_Fields[FI_DD_HOTELPRJ].field_name).IsNull then raise Exception.CreateFmt(ErrNullMaPrj_s,[m_Fields[FI_DD_HOTELCOST].field_label]); if (DataSet.FieldByName(m_Fields[FI_DD_MA1].field_name).AsFloat > 0) and DataSet.FieldByName(m_Fields[FI_DD_MAPRJ1].field_name).IsNULL then Raise Exception.CreateFmt(ErrNullMaPrj_s,[m_Fields[FI_DD_MA1].field_label]); if (DataSet.FieldByName(m_Fields[FI_DD_MA2].field_name).AsFloat > 0) and DataSet.FieldByName(m_Fields[FI_DD_MAPRJ2].field_name).IsNULL then Raise Exception.CreateFmt(ErrNullMaPrj_s,[m_Fields[FI_DD_MA2].field_label]); if (DataSet.FieldByName(m_Fields[FI_DD_MA3].field_name).AsFloat > 0) and DataSet.FieldByName(m_Fields[FI_DD_MAPRJ3].field_name).IsNULL then Raise Exception.CreateFmt(ErrNullMaPrj_s,[m_Fields[FI_DD_MA3].field_label]); if (DataSet.FieldByName(m_Fields[FI_DD_MA4].field_name).AsFloat > 0) and DataSet.FieldByName(m_Fields[FI_DD_MAPRJ4].field_name).IsNULL then Raise Exception.CreateFmt(ErrNullMaPrj_s,[m_Fields[FI_DD_MA4].field_label]); if fNeedCheckFailRemark then if (Not Self.Checked) And (Self.CheckFailRemark='') then Raise Exception.Create(ErrNoCheckFailRemark); end;
marlon_wu
一般會員


發表:5
回覆:6
積分:2
註冊:2002-09-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-05 17:21:30 IP:203.204.xxx.xxx 未訂閱
更正, 發現所有的例外狀況, 都會先出現 EAcessVialoation, 再出現runtime error 216的錯誤 然後程式被Terminate 也就是只要有例外狀況,程式就會Terminate
marlon_wu
一般會員


發表:5
回覆:6
積分:2
註冊:2002-09-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-05 18:01:15 IP:203.204.xxx.xxx 未訂閱
sorry! 是我自己太白痴, 之前在測試的時候加了Application.OnException 的事件處理程序, 裡面執行了Application.Terminate 所以只要有例外程式就會Terminate
marlon_wu
一般會員


發表:5
回覆:6
積分:2
註冊:2002-09-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-05 18:02:00 IP:203.204.xxx.xxx 未訂閱
sorry! 是我自己太白痴, 忘了之前在測試的時候加了Application.OnException 的事件處理程序, 裡面執行了Application.Terminate 所以只要有例外程式就會Terminate
系統時間:2024-05-06 20:01:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!