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

level
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;
}
  1. level ← 3

    11int main() {12    int level→ 3 = 3; //@level=0, 5
  2. try

    14try {15    std::string message = describeLevel(level3);16    std::cout << message << std::endl;
  3. 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}
  4. 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=3
  5. std::cout << "checked=1" << std::endl;

    21    std::cout << "checked=1" << std::endl;22    return 0;23}
    outputchecked=1
  1. level ← 0

    11int main() {12    int level→ 0 = 0;
  2. try

    14try {15    std::string message = describeLevel(level0);16    std::cout << message << std::endl;
  3. std::string describeLevel(int level)

    4std::string describeLevel(int level0) {5    if (level < 1) {
  4. if (level < 1)

    4std::string describeLevel(int level) {5    if (level0 < 1) {6        throw std::string("level too low");7    }
  5. 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 low
  6. std::cout << "checked=1" << std::endl;

    21    std::cout << "checked=1" << std::endl;22    return 0;23}
    outputchecked=1
  1. level ← 5

    11int main() {12    int level→ 5 = 5;
  2. try

    14try {15    std::string message = describeLevel(level5);16    std::cout << message << std::endl;
  3. 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}
  4. 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=5
  5. std::cout << "checked=1" << std::endl;

    21    std::cout << "checked=1" << std::endl;22    return 0;23}
    outputchecked=1