C++ Tutorial/Exceptions/try catch
Содержание
- 1 A simple exception handling example
- 2 A try block can be localized to a function
- 3 Catch all exceptions
- 4 Catch "char *" exception
- 5 Catching derived classes
- 6 Multiple catch blocks
- 7 Throwing an exception from a function called from within a try block
- 8 try catch block without exception being thrown
- 9 Use catch(...) as a default
- 10 Use multiple catch statements
A simple exception handling example
<source lang="cpp">#include <iostream> using namespace std; int main() {
cout << "Start\n"; try { cout << "Inside try block\n"; throw 1; // throw an error cout << "This will not execute"; } catch (int i) { // catch an error cout << "Caught an exception -- value is: "; cout << i << "\n"; } cout << "End"; return 0;
}</source>
Start Inside try block Caught an exception -- value is: 1 End"
A try block can be localized to a function
<source lang="cpp">#include <iostream> using namespace std;
void f(int test) {
try{ if(test) throw test; } catch(int i) { cout << "Caught One! Ex. #: " << i << "\n"; }
}
int main() {
cout << "start\n"; f(1); f(2); f(0); f(3); cout << "end"; return 0;
}</source>
start Caught One! Ex. #: 1 Caught One! Ex. #: 2 Caught One! Ex. #: 3 end
Catch all exceptions
<source lang="cpp">#include <iostream> using namespace std;
void f(int test) {
try{ if(test==0) throw test; // throw int if(test==1) throw "a"; // throw char if(test==2) throw 123.23; // throw double } catch(...) { // catch all exceptions cout << "Caught One!\n"; }
}
int main() {
f(0); f(1); f(2); return 0;
}</source>
Caught One! Caught One! Caught One!
Catch "char *" exception
<source lang="cpp">#include <iostream.h> int main () {
try { throw "Out of range"; } catch (char * str) { cout << "Exception: " << str << endl; } return 0;
}</source>
This application has requested the Runtime to terminate it in an unusual way. Please contact the application"s support team for more information.
Catching derived classes
<source lang="cpp">#include <iostream> using namespace std; class B { }; class D: public B { }; int main() {
D derived; try { throw derived; } catch(B b) { cout << "Caught a base class.\n"; } catch(D d) { cout << "This won"t execute.\n"; } return 0;
}</source>
Multiple catch blocks
<source lang="cpp">#include <iostream.h> int main () {
try { char * mystring; mystring = new char [10]; if (mystring == NULL) throw "Allocation failure"; for (int n=0; n<=100; n++) { if (n>9) throw n; mystring[n]="a"; } } catch (int i) { cout << "index " << i << " is out of range" << endl; } catch (char * str) { cout << "Exception: " << str << endl; } return 0;
}</source>
index 10 is out of range
Throwing an exception from a function called from within a try block
<source lang="cpp">#include <iostream> using namespace std;
void f(int test) {
cout << "Inside f, test is: " << test << "\n"; if(test) throw test;
}
int main() {
cout << "start\n"; try { // start a try block cout << "Inside try block\n"; f(0); f(1); f(2); } catch (int i) { // catch an error cout << "Caught an exception -- value is: "; cout << i << "\n"; } cout << "end"; return 0;
}</source>
start Inside try block Inside f, test is: 0 Inside f, test is: 1 Caught an exception -- value is: 1 end
try catch block without exception being thrown
<source lang="cpp">#include <iostream> using namespace std; int main() {
cout << "Start\n"; try { cout << "Inside try block\n"; cout << "Still inside try block\n"; } catch (int i) { cout << "Caught an exception -- value is: "; cout << i << "\n"; } cout << "End"; return 0;
}</source>
Start Inside try block Still inside try block End"
Use catch(...) as a default
<source lang="cpp">#include <iostream> using namespace std; void f(int val) {
try{ if(val==0) throw val; if(val==1) throw "a"; if(val==2) throw 123.23; } catch(int i) { // catch an int exception cout << "Caught an integer\n"; } catch(...) { // catch all other exceptions cout << "Caught One!\n"; }
} int main() {
f(0); f(1); f(2); return 0;
}</source>
Caught an integer Caught One! Caught One!
Use multiple catch statements
<source lang="cpp">#include <iostream> using namespace std;
void f(int test) {
try{ if(test) throw test; // throw int else throw "Value is zero"; // throw char * } catch(int i) { cout << "Caught One! Ex. #: " << i << "\n"; } catch(char *str) { cout << "Caught a string: "; cout << str << "\n"; }
}
int main() {
cout << "start\n"; f(1); f(2); f(0); f(3); cout << "end"; return 0;
}</source>
start Caught One! Ex. #: 1 Caught One! Ex. #: 2 This application has requested the Runtime to terminate it in an unusual way. Please contact the application"s support team for more information.