Exceptions
Throw Values
throw sends a value to a handler when a function cannot continue normally.
throw
A thrown value leaves the current function and looks for a matching `catch` block.
Throw Values
throw_values.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>
std::string describeLevel(int level) {
if (level < 1) {
throw std::string("level too low");
}
return "level=" + std::to_string(level);
}
int main() {
int level = 3;
try {
std::string message = describeLevel(level);
std::cout << message << std::endl;
} catch (const std::string& message) {
std::cout << "caught=" << message << std::endl;
}
std::cout << "checked=1" << std::endl;
return 0;
}
#include <iostream>
#include <string>
std::string describeLevel(int level) {
if (level < 1) {
throw std::string("level too low");
}
return "level=" + std::to_string(level);
}
int main() {
int level = 0;
try {
std::string message = describeLevel(level);
std::cout << message << std::endl;
} catch (const std::string& message) {
std::cout << "caught=" << message << std::endl;
}
std::cout << "checked=1" << std::endl;
return 0;
}
#include <iostream>
#include <string>
std::string describeLevel(int level) {
if (level < 1) {
throw std::string("level too low");
}
return "level=" + std::to_string(level);
}
int main() {
int level = 5;
try {
std::string message = describeLevel(level);
std::cout << message << std::endl;
} catch (const std::string& message) {
std::cout << "caught=" << message << std::endl;
}
std::cout << "checked=1" << std::endl;
return 0;
}
level ← 3
11int main() {12 int level→ 3 = 3; //@level=0, 5try
14try {15 std::string message = describeLevel(level3);16 std::cout << message << std::endl;std::string describeLevel(int level)
4std::string describeLevel(int level3) {5 if (level < 1) {6 throw std::string("level too low");7 }8 return "level=" + std::to_string(level3);9}message ← level=3
14try {15 std::string message→ level=3 = describeLevel(level3);16 std::cout << messagelevel=3 << std::endl;17} catch (const std::string& message) {outputlevel=3std::cout << "checked=1" << std::endl;
21 std::cout << "checked=1" << std::endl;22 return 0;23}outputchecked=1
level ← 0
11int main() {12 int level→ 0 = 0;try
14try {15 std::string message = describeLevel(level0);16 std::cout << message << std::endl;std::string describeLevel(int level)
4std::string describeLevel(int level0) {5 if (level < 1) {if (level < 1)
4std::string describeLevel(int level) {5 if (level0 < 1) {6 throw std::string("level too low");7 }catch (const std::string& message)
16 std::cout << message << std::endl;17} catch (const std::string& message) {18 std::cout << "caught=" << message << std::endl;19}outputcaught=level too lowstd::cout << "checked=1" << std::endl;
21 std::cout << "checked=1" << std::endl;22 return 0;23}outputchecked=1
level ← 5
11int main() {12 int level→ 5 = 5;try
14try {15 std::string message = describeLevel(level5);16 std::cout << message << std::endl;std::string describeLevel(int level)
4std::string describeLevel(int level5) {5 if (level < 1) {6 throw std::string("level too low");7 }8 return "level=" + std::to_string(level5);9}message ← level=5
14try {15 std::string message→ level=5 = describeLevel(level5);16 std::cout << messagelevel=5 << std::endl;17} catch (const std::string& message) {outputlevel=5std::cout << "checked=1" << std::endl;
21 std::cout << "checked=1" << std::endl;22 return 0;23}outputchecked=1