2012-01-24 8 views
2

私はプログラミングが初めてで、try/catch節に問題があります。ここで C++ try/catch(プログラミングには新しく、この節についてはあまり知られていません)

は、私が持っている教科書の例です:

int main() 
{ 
    char *ptr; 

    try { 
     ptr = new char[ 1000000000 ]; 
    } 

    catch(…) { 
     cout << "Too many elements" << endl; 
    } 

    return 0; 
} 

は、私は、さらなる説明のために、オンラインで見しようとしたと教科書は正確にそれが何であるかをどのようなこれらの句は、実際に行うかを教えていませんのために使用される。

詳細情報は役に立ちます。

編集:私は使用しています教科書は次のとおりです。 C++:ジェフリー・チャイルズによってクラスとデータ構造

+0

これはC++ [例外処理](http://www.parashift.com/c++-faq-lite/exceptions.html)です。別のリンクはここにあります:http://msdn.microsoft.com/en-us/library/6dekhbbc.aspx – birryree

+3

これは多くの点で恐ろしい例です。あなたの目を洗い流し、文書を読んでください。 – bmargulies

+1

FWIW C++を初めてお使いの方は例外処理と例外にはなりません – AJG85

答えて

0

てみキャッチは、例外を処理する方法です。

// CATCH BLOCK 
catch(MyException const& e) 
{ 
    // Correct a MyException 
} 
catch(std::exception const& e) 
{ 
    // Correct a std::exception 
    // For example this would cat any exception derived from std::exception 
} 

好きなだけ多くのキャッチブロックを配置できます。catch文のcatch式のいずれかと例外が一致した場合、関連するコードブロックが実行されます。キャッチ式が例外にマッチしない場合、スタックは上位のキャッチブロックを検出してプロセスが繰り返されるまで巻き戻されます(キャッチブロックが一致しないとアプリケーションが終了する可能性があります)。

注:複数のキャッチ式が一致すると、最初に字句的に使用されます。キャッチブロックは1つだけ実行されます。 noneの場合、コンパイラはより高いレベルのtry/catchを探します。

キャッチ何句は

catch(...) 
{ 
    // This is a catch all. 
    // If the exception is not listed above this will catch any exception. 
} 

は、どのように、これはあなたのコードには適用されないもあります。

int main() 
{ 
    char *ptr; 

    try 
    { 
     // This calls ::new() which can potentially throw std::bad_alloc 
     // If this happens then it will look for a catch block. 
     ptr = new char[ 1000000000 ]; 


    // If the ::new() works then nothing happens and you pointer `ptr` 
    // is valid and code continues to execute. 
    } 
    catch(…) 
    { 
     // You only have one catch block that catches everything. 
     // So if there are any statements that generate an exception this will catch 
     // the excetption and execute this code. 

     cout << "Too many elements" << endl; 
    } 
    // As you have caught all exceptions the code will continue from here. 
    // Either after the try block finishes successfully or 
    // After an exception has been handled by the catch block. 

    return 0; 
} 
+0

これは私にとって本当に素晴らしい説明です。私に提供された虚偽の例との関係を教えてくれてありがとう。 –

2

のtry-catchは、C++例外処理のための構築物です。 Googleの「C++の例外」

-1

try-catchブロックは、コードのエラーをトラップするために使用されます。

最も基本的なレベルでは、プログラムが無効な命令を実行しようとするため、エラーが発生します。その命令(コード行を読む)は、いくつかの理由で無効になる可能性があります。具体的な例では、あなたのプログラムがあなたのptrをストーリーするために1,000,000,000バイトのメモリを割り当てることができなかった場合、命令は無効になる可能性があります。最も一般的な例外は、作成されていないオブジェクト、または削除された(または破損した)オブジェクトに対して何らかのアクションを実行しようとしたときに発生するNull Pointer Exceptionと呼ばれる不良ポインタにアクセスしようとすることです。あなたはその例外を嫌うことを学ぶでしょう。

catch(...)を使用すると、tryブロック内のコード内にエラーが発生した場合、プログラムはcatchブロック内のコードを実行します。あなたはあなたのエラーを処理し、エラー条件を修正するか、適切にそのモジュールを終了するために何かを見つけることを試みることができます。すでにCを知っている場合は、エラー処理のために使用された場合http://www.cplusplus.com/doc/tutorial/exceptions/

+1

C++には "Null Pointer Exceptions"はありません。 –

+0

これは、C++の例外に関するほとんどすべての点を欠場する非常に貧弱な説明です。彼らは、確かに "間違いを捕まえる"ために役立たない。 –

+0

これは、例外がまともであるかどうかわかっていても、詳細がわかっていても例外を概観し、try/catchブロックを与えると思います。 –

-5

は、try/catchsetjmp/longjmpと同じことを実現:

また、あなたはここについての詳細を調べることができ、特定のエラーをキャッチすることができます。 if setjmpのコードとしてtryと考えてください。setjmpのコードはcatchです。これにより、longjmpはC++のthrowと等価となり、例外をスローするために使用されます。あなたの例では、おそらく内部でメモリ割り当て関数を呼び出すnew演算子は、C++ throw演算子を使用して非常に大きな数を入力として見ることに例外をスローします。

void a() 
{ 
     ....... 
     longjmp(buf,1);  // <--- similar to throw 
     ....... 
} 

if (!setjmp(buf))  // <--- similar to try 
{ 
     ....... 
     a(); 
     .......     
} 
else      // <--- similar to catch 
{      
     .......   
} 

try/catchsetjmp/longjmpのためにあなたがtry/catchのために必要ではない揮発性としてsetjmp/longjmp呼び出し、間に修正される変数を宣言する必要がありますように、もう少し洗練されたsetjmp/longjmp以下です。あなたが処理するために何をしたいの例外定義する場所

try 
{ 
     // Do work in here 
     // If any exceptions are generated then the code in here is stopped. 
     // and a jump is made to the catch block. 
     // to see if the exception can be handled. 

     // An exception is generated when somebody uses throw. 
     // Either you or one of the functions you call. 

     // In your case new can throw std::bad_alloc 
     // Which is derived from std::runtime_error which is derived from std::exception 

} 
// CATCH BLOCK HERE. 

catchブロックは次のとおりです。

+0

プログラミングに新しい人は、おそらく 'setjmp/longjmp'に慣れていないでしょう。 –

+0

setjmp/longjmpペアは、例外の実装には使用されません。あなたの知識をリフレッシュする時間: –

+0

Vlad Lazerenko - 誰がsetjmp/longjmpを例外処理に使用できないと言ったのですか?ウィキペディアの記事によれば、それは本当にそれに使われています。実際、Microsoft Cコンパイラで見つかった古い__tryマクロと__catchマクロはおそらくsetjmp/longjmpを使用していました。 – MetallicPriest

関連する問題