Replace most naked throws with macros from catch_enforce.h

This is a first step towards support a no-exceptions mode
This commit is contained in:
Martin Hořeňovský 2018-09-03 10:03:47 +02:00
parent ef9150fe6f
commit 86da2846af
7 changed files with 28 additions and 34 deletions

View File

@ -7,10 +7,10 @@
*/ */
#include "catch_approx.h" #include "catch_approx.h"
#include "catch_enforce.h"
#include <cmath> #include <cmath>
#include <limits> #include <limits>
#include <stdexcept>
namespace { namespace {
@ -56,23 +56,16 @@ namespace Detail {
} }
void Approx::setMargin(double margin) { void Approx::setMargin(double margin) {
if (margin < 0) { CATCH_ENFORCE(margin >= 0,
throw std::domain_error "Invalid Approx::margin: " << margin << '.'
("Invalid Approx::margin: " + << " Approx::Margin has to be non-negative.");
Catch::Detail::stringify(margin) +
", Approx::Margin has to be non-negative.");
}
m_margin = margin; m_margin = margin;
} }
void Approx::setEpsilon(double epsilon) { void Approx::setEpsilon(double epsilon) {
if (epsilon < 0 || epsilon > 1.0) { CATCH_ENFORCE(epsilon >= 0 && epsilon <= 1.0,
throw std::domain_error "Invalid Approx::epsilon: " << epsilon << '.'
("Invalid Approx::epsilon: " + << " Approx::epsilon has to be in [0, 1]");
Catch::Detail::stringify(epsilon) +
", Approx::epsilon has to be between 0 and 1");
}
m_epsilon = epsilon; m_epsilon = epsilon;
} }

View File

@ -18,6 +18,8 @@
throw CATCH_PREPARE_EXCEPTION( std::logic_error, CATCH_INTERNAL_LINEINFO << ": Internal Catch error: " << msg); throw CATCH_PREPARE_EXCEPTION( std::logic_error, CATCH_INTERNAL_LINEINFO << ": Internal Catch error: " << msg);
#define CATCH_ERROR( msg ) \ #define CATCH_ERROR( msg ) \
throw CATCH_PREPARE_EXCEPTION( std::domain_error, msg ) throw CATCH_PREPARE_EXCEPTION( std::domain_error, msg )
#define CATCH_RUNTIME_ERROR( msg ) \
throw CATCH_PREPARE_EXCEPTION( std::runtime_error, msg )
#define CATCH_ENFORCE( condition, msg ) \ #define CATCH_ENFORCE( condition, msg ) \
do{ if( !(condition) ) CATCH_ERROR( msg ); } while(false) do{ if( !(condition) ) CATCH_ERROR( msg ); } while(false)

View File

@ -9,6 +9,7 @@
#include "catch_interfaces_generatortracker.h" #include "catch_interfaces_generatortracker.h"
#include "catch_common.h" #include "catch_common.h"
#include "catch_enforce.h"
#include <memory> #include <memory>
#include <vector> #include <vector>
@ -76,7 +77,7 @@ namespace Generators {
template<typename T> template<typename T>
struct NullGenerator : IGenerator<T> { struct NullGenerator : IGenerator<T> {
auto get( size_t ) const -> T override { auto get( size_t ) const -> T override {
throw std::logic_error("A Null Generator should always be empty" ); CATCH_INTERNAL_ERROR("A Null Generator is always empty");
} }
}; };
@ -198,7 +199,7 @@ namespace Generators {
if( index < sizes ) if( index < sizes )
return gen[localIndex]; return gen[localIndex];
} }
throw std::out_of_range("index out of range"); CATCH_INTERNAL_ERROR("Index '" << index << "' is out of range (" << sizes << ')');
} }
}; };

View File

@ -6,13 +6,13 @@
*/ */
#include "catch_matchers_floating.h" #include "catch_matchers_floating.h"
#include "catch_enforce.h"
#include "catch_to_string.hpp" #include "catch_to_string.hpp"
#include "catch_tostring.h" #include "catch_tostring.h"
#include <cstdlib> #include <cstdlib>
#include <cstdint> #include <cstdint>
#include <cstring> #include <cstring>
#include <stdexcept>
namespace Catch { namespace Catch {
namespace Matchers { namespace Matchers {
@ -81,9 +81,8 @@ namespace Matchers {
namespace Floating { namespace Floating {
WithinAbsMatcher::WithinAbsMatcher(double target, double margin) WithinAbsMatcher::WithinAbsMatcher(double target, double margin)
:m_target{ target }, m_margin{ margin } { :m_target{ target }, m_margin{ margin } {
if (m_margin < 0) { CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.'
throw std::domain_error("Allowed margin difference has to be >= 0"); << " Margin has to be non-negative.");
}
} }
// Performs equivalent check of std::fabs(lhs - rhs) <= margin // Performs equivalent check of std::fabs(lhs - rhs) <= margin
@ -99,9 +98,8 @@ namespace Floating {
WithinUlpsMatcher::WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType) WithinUlpsMatcher::WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType)
:m_target{ target }, m_ulps{ ulps }, m_type{ baseType } { :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } {
if (m_ulps < 0) { CATCH_ENFORCE(ulps >= 0, "Invalid ULP setting: " << ulps << '.'
throw std::domain_error("Allowed ulp difference has to be >= 0"); << " ULPs have to be non-negative.");
}
} }
#if defined(__clang__) #if defined(__clang__)
@ -117,7 +115,7 @@ namespace Floating {
case FloatingPointKind::Double: case FloatingPointKind::Double:
return almostEqualUlps<double>(matchee, m_target, m_ulps); return almostEqualUlps<double>(matchee, m_target, m_ulps);
default: default:
throw std::domain_error("Unknown FloatingPointKind value"); CATCH_INTERNAL_ERROR( "Unknown FloatingPointKind value" );
} }
} }

View File

@ -6,8 +6,7 @@
*/ */
#include "catch_output_redirect.h" #include "catch_output_redirect.h"
#include "catch_enforce.h"
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
@ -56,21 +55,21 @@ namespace Catch {
#if defined(_MSC_VER) #if defined(_MSC_VER)
TempFile::TempFile() { TempFile::TempFile() {
if (tmpnam_s(m_buffer)) { if (tmpnam_s(m_buffer)) {
throw std::runtime_error("Could not get a temp filename"); CATCH_RUNTIME_ERROR("Could not get a temp filename");
} }
if (fopen_s(&m_file, m_buffer, "w")) { if (fopen_s(&m_file, m_buffer, "w")) {
char buffer[100]; char buffer[100];
if (strerror_s(buffer, errno)) { if (strerror_s(buffer, errno)) {
throw std::runtime_error("Could not translate errno to string"); CATCH_RUNTIME_ERROR("Could not translate errno to a string");
} }
throw std::runtime_error("Could not open the temp file: " + std::string(m_buffer) + buffer); CATCH_RUNTIME_ERROR("Coul dnot open the temp file: '" << m_buffer << "' because: " << buffer);
} }
} }
#else #else
TempFile::TempFile() { TempFile::TempFile() {
m_file = std::tmpfile(); m_file = std::tmpfile();
if (!m_file) { if (!m_file) {
throw std::runtime_error("Could not create a temp file."); CATCH_RUNTIME_ERROR("Could not create a temp file.");
} }
} }

View File

@ -8,6 +8,7 @@
#ifndef TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED #ifndef TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED
#define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED #define TWOBLUECUBES_CATCH_REPORTER_BASES_HPP_INCLUDED
#include "../internal/catch_enforce.h"
#include "../internal/catch_interfaces_reporter.h" #include "../internal/catch_interfaces_reporter.h"
#include <algorithm> #include <algorithm>
@ -33,7 +34,7 @@ namespace Catch {
{ {
m_reporterPrefs.shouldRedirectStdOut = false; m_reporterPrefs.shouldRedirectStdOut = false;
if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )
throw std::domain_error( "Verbosity level not supported by this reporter" ); CATCH_ERROR( "Verbosity level not supported by this reporter" );
} }
ReporterPreferences getPreferences() const override { ReporterPreferences getPreferences() const override {
@ -148,7 +149,7 @@ namespace Catch {
{ {
m_reporterPrefs.shouldRedirectStdOut = false; m_reporterPrefs.shouldRedirectStdOut = false;
if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )
throw std::domain_error( "Verbosity level not supported by this reporter" ); CATCH_ERROR( "Verbosity level not supported by this reporter" );
} }
~CumulativeReporterBase() override = default; ~CumulativeReporterBase() override = default;

View File

@ -97,12 +97,12 @@ namespace Catch {
case ResultWas::Ok: case ResultWas::Ok:
case ResultWas::Info: case ResultWas::Info:
case ResultWas::Warning: case ResultWas::Warning:
throw std::domain_error( "Internal error in TeamCity reporter" ); CATCH_ERROR( "Internal error in TeamCity reporter" );
// These cases are here to prevent compiler warnings // These cases are here to prevent compiler warnings
case ResultWas::Unknown: case ResultWas::Unknown:
case ResultWas::FailureBit: case ResultWas::FailureBit:
case ResultWas::Exception: case ResultWas::Exception:
throw std::domain_error( "Not implemented" ); CATCH_ERROR( "Not implemented" );
} }
if( assertionStats.infoMessages.size() == 1 ) if( assertionStats.infoMessages.size() == 1 )
msg << " with message:"; msg << " with message:";