Remove unnecessary exception handling in settings

Use optionals instead where a value can be absent

Fixes #4024
This commit is contained in:
Jon Evans 2020-03-07 16:06:33 -05:00
parent 37befc5a42
commit 8cb8d55843
5 changed files with 50 additions and 65 deletions

View File

@ -300,20 +300,16 @@ bool COLOR_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
COLOR4D COLOR_SETTINGS::GetColor( int aLayer ) const COLOR4D COLOR_SETTINGS::GetColor( int aLayer ) const
{ {
try if( m_color_context == COLOR_CONTEXT::FOOTPRINT && aLayer >= PCBNEW_LAYER_ID_START
&& aLayer <= GAL_LAYER_ID_END )
{ {
if( m_color_context == COLOR_CONTEXT::FOOTPRINT && aLayer >= PCBNEW_LAYER_ID_START aLayer += FPEDIT_LAYER_ID_START;
&& aLayer <= GAL_LAYER_ID_END ) }
{
aLayer += FPEDIT_LAYER_ID_START;
}
if( m_colors.count( aLayer ) )
return m_colors.at( aLayer ); return m_colors.at( aLayer );
}
catch( std::out_of_range& ) return COLOR4D::UNSPECIFIED;
{
return COLOR4D::UNSPECIFIED;
}
} }

View File

@ -237,20 +237,22 @@ void JSON_SETTINGS::SaveToFile( const std::string& aDirectory )
} }
nlohmann::json JSON_SETTINGS::GetJson( std::string aPath ) const OPT<nlohmann::json> JSON_SETTINGS::GetJson( std::string aPath ) const
{ {
nlohmann::json ret( {} ); nlohmann::json::json_pointer ptr = PointerFromString( std::move( aPath ) );
// Will throw an exception if the path is not found if( this->contains( ptr ) )
try
{
ret = this->at( PointerFromString( std::move( aPath ) ) );
}
catch( ... )
{ {
try
{
return OPT<nlohmann::json>{ this->at( ptr ) };
}
catch( ... )
{
}
} }
return ret; return OPT<nlohmann::json>{};
} }
@ -403,9 +405,12 @@ void JSON_SETTINGS::ReleaseNestedSettings( NESTED_SETTINGS* aSettings )
// Specializations to allow conversion between wxString and std::string via JSON_SETTINGS API // Specializations to allow conversion between wxString and std::string via JSON_SETTINGS API
template<> wxString JSON_SETTINGS::Get( std::string aPath ) const template<> OPT<wxString> JSON_SETTINGS::Get( std::string aPath ) const
{ {
return wxString( GetJson( std::move( aPath ) ).get<std::string>().c_str(), wxConvUTF8 ); if( OPT<nlohmann::json> opt_json = GetJson( std::move( aPath ) ) )
return wxString( opt_json->get<std::string>().c_str(), wxConvUTF8 );
return NULLOPT;
} }

View File

@ -129,12 +129,8 @@ public:
COLOR4D val = m_default; COLOR4D val = m_default;
try if( OPT<COLOR4D> optval = aSettings->Get<COLOR4D>( m_path ) )
{ val = *optval;
val = aSettings->Get<COLOR4D>( m_path );
}
catch( ... )
{}
( *m_map )[ m_key ] = val; ( *m_map )[ m_key ] = val;
} }

View File

@ -25,6 +25,8 @@
#include <utility> #include <utility>
#include <wx/string.h> #include <wx/string.h>
#include <core/optional.h>
class wxConfigBase; class wxConfigBase;
class NESTED_SETTINGS; class NESTED_SETTINGS;
class PARAM_BASE; class PARAM_BASE;
@ -90,19 +92,22 @@ public:
* @param aPath is a string containing one or more keys separated by '.' * @param aPath is a string containing one or more keys separated by '.'
* @return a JSON object from within this one * @return a JSON object from within this one
*/ */
nlohmann::json GetJson( std::string aPath ) const; OPT<nlohmann::json> GetJson( std::string aPath ) const;
/** /**
* Fetches a value from within the JSON document. * Fetches a value from within the JSON document.
* Will throw an exception if the value is not found or a mismatching type. * Will return an empty optional if the value is not found or a mismatching type.
* @tparam ValueType is the type to cast to * @tparam ValueType is the type to cast to
* @param aPath is the path within the document to retrieve * @param aPath is the path within the document to retrieve
* @return a value from within this document * @return a value from within this document
*/ */
template<typename ValueType> template<typename ValueType>
ValueType Get( std::string aPath ) const OPT<ValueType> Get( std::string aPath ) const
{ {
return GetJson( std::move( aPath ) ).get<ValueType>(); if( OPT<nlohmann::json> ret = GetJson( std::move( aPath ) ) )
return ret->get<ValueType>();
return NULLOPT;
} }
/** /**
@ -220,7 +225,7 @@ protected:
// Specializations to allow conversion between wxString and std::string via JSON_SETTINGS API // Specializations to allow conversion between wxString and std::string via JSON_SETTINGS API
template<> wxString JSON_SETTINGS::Get( std::string aPath ) const; template<> OPT<wxString> JSON_SETTINGS::Get( std::string aPath ) const;
template<> void JSON_SETTINGS::Set<wxString>( std::string aPath, wxString aVal ); template<> void JSON_SETTINGS::Set<wxString>( std::string aPath, wxString aVal );

View File

@ -22,10 +22,11 @@
#define _PARAMETERS_H #define _PARAMETERS_H
#include <string> #include <string>
#include <boost/ptr_container/ptr_vector.hpp>
#include <utility> #include <utility>
#include <math/util.h> #include <math/util.h>
#include "json_settings.h"
#include <core/optional.h>
#include <settings/json_settings.h>
class PARAM_BASE class PARAM_BASE
@ -81,9 +82,9 @@ public:
ValueType val = m_default; ValueType val = m_default;
try if( OPT<ValueType> optval = aSettings->Get<ValueType>( m_path ) )
{ {
val = aSettings->Get<ValueType>( m_path ); val = *optval;
if( m_use_minmax ) if( m_use_minmax )
{ {
@ -91,8 +92,6 @@ public:
val = m_default; val = m_default;
} }
} }
catch( ... )
{}
*m_ptr = val; *m_ptr = val;
} }
@ -141,16 +140,10 @@ public:
ValueType val = m_default; ValueType val = m_default;
try if( std::is_same<ValueType, nlohmann::json>::value )
{ val = aSettings->GetJson( m_path );
if( std::is_same<ValueType, nlohmann::json>::value ) else
val = aSettings->GetJson( m_path ); val = aSettings->Get<ValueType>( m_path );
else
val = aSettings->Get<ValueType>( m_path );
}
catch( ... )
{
}
m_setter( val ); m_setter( val );
} }
@ -274,21 +267,16 @@ public:
std::vector<Type> val = m_default; std::vector<Type> val = m_default;
try if( OPT<nlohmann::json> js = aSettings->GetJson( m_path ) )
{ {
nlohmann::json js = aSettings->GetJson( m_path ); if( js->is_array() )
if( js.is_array() )
{ {
val.clear(); val.clear();
for( const auto& el : js.items() ) for( const auto& el : js->items() )
val.push_back( el.value().get<Type>() ); val.push_back( el.value().get<Type>() );
} }
} }
catch( ... )
{
}
*m_ptr = val; *m_ptr = val;
} }
@ -342,21 +330,16 @@ public:
std::map<std::string, Value> val = m_default; std::map<std::string, Value> val = m_default;
try if( OPT<nlohmann::json> js = aSettings->GetJson( m_path ) )
{ {
nlohmann::json js = aSettings->GetJson( m_path ); if( js->is_object() )
if( js.is_object() )
{ {
val.clear(); val.clear();
for( const auto& el : js.items() ) for( const auto& el : js->items() )
val[ el.key() ] = el.value().get<Value>(); val[ el.key() ] = el.value().get<Value>();
} }
} }
catch( ... )
{
}
*m_ptr = val; *m_ptr = val;
} }