aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-04-10 20:23:39 +0200
committerEven Rouault <even.rouault@spatialys.com>2020-04-10 20:23:39 +0200
commit21ebdfb89bc4b222c4fb78815971b19192a2a09e (patch)
tree81a25709ceec977cf78459acfd323b585e1a8670 /src
parentc2751ebc4f2d75f7110a046e690f4a801a6b9bcb (diff)
downloadPROJ-21ebdfb89bc4b222c4fb78815971b19192a2a09e.tar.gz
PROJ-21ebdfb89bc4b222c4fb78815971b19192a2a09e.zip
proj_create(): improve error message in case of PJ* failure instanciation
Diffstat (limited to 'src')
-rw-r--r--src/iso19111/io.cpp23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/iso19111/io.cpp b/src/iso19111/io.cpp
index 868095d4..07620864 100644
--- a/src/iso19111/io.cpp
+++ b/src/iso19111/io.cpp
@@ -9437,12 +9437,17 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
if (!pj_context) {
throw ParsingException("out of memory");
}
+
+ // Backup error logger and level, and install temporary handler
+ auto old_logger = pj_context->logger;
+ auto old_logger_app_data = pj_context->logger_app_data;
+ auto log_level = proj_log_level(pj_context, PJ_LOG_ERROR);
+ proj_log_func(pj_context, &logger, Logger::log);
+
if (pj_context != d->ctx_) {
- proj_log_func(pj_context, &logger, Logger::log);
proj_context_use_proj4_init_rules(pj_context, d->usePROJ4InitRules_);
}
pj_context->projStringParserCreateFromPROJStringRecursionCounter++;
- auto log_level = proj_log_level(pj_context, PJ_LOG_NONE);
auto pj = pj_create_internal(
pj_context, (projString.find("type=crs") != std::string::npos
? projString + " +disable_grid_presence_check"
@@ -9450,7 +9455,11 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
.c_str());
pj_context->projStringParserCreateFromPROJStringRecursionCounter--;
valid = pj != nullptr;
+
+ // Restore initial error logger and level
proj_log_level(pj_context, log_level);
+ pj_context->logger = old_logger;
+ pj_context->logger_app_data = old_logger_app_data;
// Remove parameters not understood by PROJ.
if (valid && d->steps_.size() == 1) {
@@ -9512,13 +9521,13 @@ PROJStringParser::createFromPROJString(const std::string &projString) {
proj_destroy(pj);
if (!valid) {
- std::string prefix("Error " + toString(proj_context_errno(pj_context)) +
- ": ");
+ const int l_errno = proj_context_errno(pj_context);
+ std::string prefix("Error " + toString(l_errno) + " (" +
+ proj_errno_string(l_errno) + ")");
if (logger.msg.empty()) {
- logger.msg =
- prefix + proj_errno_string(proj_context_errno(pj_context));
+ logger.msg = prefix;
} else {
- logger.msg = prefix + logger.msg;
+ logger.msg = prefix + ": " + logger.msg;
}
}