You learned that exceptions change control flow. When throw executes, the function exits immediately and the stack unwinds until a matching catch is found.
Exceptions are for exceptional circumstances, not regular control flow. Don't use throw to exit loops or signal common conditions.
The e.what() method returns the error message you passed when throwing. Use descriptive messages that help debugging. Include relevant values when possible: throw runtime_error("Index out of bounds: " + to_string(index)).