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

c++例外處理的問題

尚未結案
kitsam
一般會員


發表:13
回覆:11
積分:4
註冊:2005-02-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-06 14:25:52 IP:61.18.xxx.xxx 未訂閱
大家好,小弟玩了C 不久,但對於例外處理的問題有意見。 我發現在C 中的try部分內,仍然需要由設計師用if或其他方法自行檢查錯誤,有錯誤就用throw拋出例外,等被catch,那個做法與自行用If去判斷有沒有錯分別不大,只是在結構上會較好, 那請問在C 中有無方法像Java的例外處理一樣,一有問題就會自動被Catch??? 因為我覺得c 這個例外處理的做法不太好,連vb也有on error goto 等錯誤處理機制,可以捕捉任何錯誤,無需設計師一個一個情況去判斷。 謝謝大家
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-07 01:26:05 IP:211.76.xxx.xxx 未訂閱
kitsam你好: catch(...)可以抓下所有有錯誤物件類別。 另外我不太了解你提出的問題?什麼是"一有問題就會自動被Catch"?
kitsam
一般會員


發表:13
回覆:11
積分:4
註冊:2005-02-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-07 09:13:39 IP:219.76.xxx.xxx 未訂閱
謝謝你的回應 我的意思是說在C++中就錯誤,也要我自己去判斷,然後又是我去拋出例外,如下Code:  
 
try {
  int a=1,b=0;
  int c=a/b;
  cout<
此Code在C  中運行,到了c=a/b那一行,系統也不會自己捕捉到錯誤,還要我自己去用If判斷,如下Code:     
 
try {
  int a=1,b=0;
  if (b=0) throw "Error";
  int c=a/b;
  cout<    那才能避開錯誤,但我想知道能否用try-catch而不需要我去用If判斷? 因為在Java中只要把有可能發生錯誤的code放入try區塊中,一發生錯誤便會立即跳到catch區塊,以下是Java的Code:
 
 
try {
  int a=1,b=0;
  int c=a/b;
  System.out.println(c);
}catch(Exception ex) {
  System.out.println("Error");
}
以上的Code有錯誤便會自動捕捉,不需要我用If去判斷。
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-07 10:27:53 IP:61.64.xxx.xxx 未訂閱
引言: 謝謝你的回應 我的意思是說在C 中就錯誤,也要我自己去判斷,然後又是我去拋出例外,如下Code:
 
try {
  int a=1,b=0;
  int c=a/b;
  cout<
此Code在C  中運行,到了c=a/b那一行,系統也不會自己捕捉到錯誤,還要我自己去用If判斷,如下Code:     
 
try {
  int a=1,b=0;
  if (b=0) throw "Error";
  int c=a/b;
  cout<    那才能避開錯誤,但我想知道能否用try-catch而不需要我去用If判斷? 因為在Java中只要把有可能發生錯誤的code放入try區塊中,一發生錯誤便會立即跳到catch區塊,以下是Java的Code:
 
 
try {
  int a=1,b=0;
  int c=a/b;
  System.out.println(c);
}catch(Exception ex) {
  System.out.println("Error");
}
以上的Code有錯誤便會自動捕捉,不需要我用If去判斷。
其實Java和C 在處理例外方面是差不多的(反正這幾種高階語言都很像), Java有的C 九成九都有, 在BCB裡除0的例外為EDivByZero, Help裡說明為EDivByZero is the exception class for integer divide-by-zero errors.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  try
  {
    int a = 1, b = 0;
    int c = a / b;
  }
  catch(const EDivByZero &e)
  {
    ShowMessage("錯誤訊息: "   e.Message);
  }
}    在Java裡用catch(Exception ex)抓取所有例外, 在C  你可以用...代表所有的例外
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  try
  {
    int a = 1, b = 0;
    int c = a / b;
  }
  catch(...)
  {
    ShowMessage("錯誤");
  }
}
發表人 - zard 於 2005/02/07 10:35:48 發表人 - zard 於 2005/02/07 10:46:19
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-07 15:17:44 IP:211.76.xxx.xxx 未訂閱
Zard大大的回答已經很詳細了 不過
kitsam
一般會員


發表:13
回覆:11
積分:4
註冊:2005-02-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-07 23:37:32 IP:222.166.xxx.xxx 未訂閱
哦,謝謝Zard大大,原來我在C Builder中如果有錯誤,會先由C Builder去提示我,當我再按下Run按鈕時,程式就會跳進Catch區塊中。 那請問在C Builder中那個設定,可以令我在調試程式發生例外時,直接跳入catch區塊中而不用提示我? 最後一個問題,為何在console程式中無法捕捉到例外?? 是否在標準的C (ANSI)中的例外處理是有Bug??? 謝謝
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-08 02:50:27 IP:211.76.xxx.xxx 未訂閱
有關c exception的討論去年在c moderated討論區有很多精闢的文章 如果用google的討論區找尋可以看到記錄。 就我所記得的,c 中的catch(...)不保證能抓到系統類型的錯誤, 這不只是在Windows系統上,在Linux上...也都有這個問題。其中 的原因有許多,不過最主要是因為c 本身設計就不是只針對單一平 台或系統,因此面對系統定義的錯誤...只好由自已來處理,不建議 用catch(...)來面對。以console的例子來說,如果要抓到windows的系 統錯誤,可以使用vcl的錯誤處理。至於不同的平台,就自已要去找解 決方法了。另外c 本身的exception還有不少缺點,尤其不支援unicode。(vcl的也不支援)這點還是沒有比較好的解決方法.... 因此exception在c 中,能不丟出就不丟。如果丟出的exception無法 解決,就不catch。所以除非是程式已經無法運作的情況下,不得已才丟exception。 這個概念下,catch(...)是最不建議用的。因為在不知道錯誤類型下, 無法保證能夠處理錯誤的原因。比如要是CPU的運算已經出問題,連1加1 都算不好了,再執行任何的程式碼都沒有益處。這種情況下選擇不作catch ,讓程式早點terminate才是上上之策。 不過..BCB中有c 又有delphi的影子。delphi的錯誤處理概念,我個人覺 得和c又不太一樣。像Indy中就大方的使用Exception作訊息的傳遞,就連 Connection Closed Gracefully也用Exception來傳...真的是很特別吧. 很少看到有函式庫是這麼設計的..(應該也是我少見多怪) 一點短見..提供參考
kitsam
一般會員


發表:13
回覆:11
積分:4
註冊:2005-02-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-08 09:06:02 IP:61.10.xxx.xxx 未訂閱
哦,謝謝pwipwi大大。幸好還有C Builder這好東西。 但請問在C Builder中那個設定,可以令我在調試程式發生例外時,直接跳入catch區塊中而不用C Builder提示我?
系統時間:2024-05-19 11:23:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!