A small status value can explain why a validation step succeeded or failed.

Status Codes

status_codes.cpp
#include <iostream>
#include <string>

enum class PasswordStatus {
    ok,
    empty,
    tooShort
};

PasswordStatus checkPassword(const std::string& password) {
    if (password.empty()) {
        return PasswordStatus::empty;
    }
    if (password.size() < 6) {
        return PasswordStatus::tooShort;
    }
    return PasswordStatus::ok;
}

std::string labelFor(PasswordStatus status) {
    if (status == PasswordStatus::ok) {
        return "ok";
    }
    if (status == PasswordStatus::empty) {
        return "empty";
    }
    return "tooShort";
}

int main() {
    std::string password = ;

    PasswordStatus status = checkPassword(password);

    std::cout << "passwordLength=" << password.size() << std::endl;
    std::cout << "status=" << labelFor(status) << std::endl;
    return 0;
}
#include <iostream>
#include <string>

enum class PasswordStatus {
    ok,
    empty,
    tooShort
};

PasswordStatus checkPassword(const std::string& password) {
    if (password.empty()) {
        return PasswordStatus::empty;
    }
    if (password.size() < 6) {
        return PasswordStatus::tooShort;
    }
    return PasswordStatus::ok;
}

std::string labelFor(PasswordStatus status) {
    if (status == PasswordStatus::ok) {
        return "ok";
    }
    if (status == PasswordStatus::empty) {
        return "empty";
    }
    return "tooShort";
}

int main() {
    std::string password = ;

    PasswordStatus status = checkPassword(password);

    std::cout << "passwordLength=" << password.size() << std::endl;
    std::cout << "status=" << labelFor(status) << std::endl;
    return 0;
}
#include <iostream>
#include <string>

enum class PasswordStatus {
    ok,
    empty,
    tooShort
};

PasswordStatus checkPassword(const std::string& password) {
    if (password.empty()) {
        return PasswordStatus::empty;
    }
    if (password.size() < 6) {
        return PasswordStatus::tooShort;
    }
    return PasswordStatus::ok;
}

std::string labelFor(PasswordStatus status) {
    if (status == PasswordStatus::ok) {
        return "ok";
    }
    if (status == PasswordStatus::empty) {
        return "empty";
    }
    return "tooShort";
}

int main() {
    std::string password = ;

    PasswordStatus status = checkPassword(password);

    std::cout << "passwordLength=" << password.size() << std::endl;
    std::cout << "status=" << labelFor(status) << std::endl;
    return 0;
}
status code Returning a status keeps normal error reporting explicit and traceable.