bpo-31415: Improve error handling and caching of the importtime option. (#4138)

diff --git a/Python/import.c b/Python/import.c
index 7ba1842..950c872 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1667,45 +1667,52 @@
         }
     }
     else {
-        static int ximporttime = 0;
+        /* 1 -- true, 0 -- false, -1 -- not initialized */
+        static int ximporttime = -1;
         static int import_level;
         static _PyTime_t accumulated;
         _Py_IDENTIFIER(importtime);
 
         _PyTime_t t1 = 0, accumulated_copy = accumulated;
 
-        Py_XDECREF(mod);
-
         /* XOptions is initialized after first some imports.
-         * So we can't have negative cache.
-         * Anyway, importlib.__find_and_load is much slower than
-         * _PyDict_GetItemId()
+         * So we can't have negative cache before completed initialization.
+         * Anyway, importlib._find_and_load is much slower than
+         * _PyDict_GetItemIdWithError().
          */
-        if (ximporttime == 0) {
-            char *envoption = Py_GETENV("PYTHONPROFILEIMPORTTIME");
-            if (envoption != NULL && strlen(envoption) > 0) {
+        if (ximporttime < 0) {
+            const char *envoption = Py_GETENV("PYTHONPROFILEIMPORTTIME");
+            if (envoption != NULL && *envoption != '\0') {
                 ximporttime = 1;
             }
             else {
                 PyObject *xoptions = PySys_GetXOptions();
+                PyObject *value = NULL;
                 if (xoptions) {
-                    PyObject *value = _PyDict_GetItemId(
+                    value = _PyDict_GetItemIdWithError(
                         xoptions, &PyId_importtime);
+                }
+                if (value == NULL && PyErr_Occurred()) {
+                    goto error;
+                }
+                if (value != NULL || Py_IsInitialized()) {
                     ximporttime = (value == Py_True);
                 }
             }
-            if (ximporttime) {
+            if (ximporttime > 0) {
                 fputs("import time: self [us] | cumulative | imported package\n",
                       stderr);
             }
         }
 
-        if (ximporttime) {
+        if (ximporttime > 0) {
             import_level++;
             t1 = _PyTime_GetPerfCounter();
             accumulated = 0;
         }
 
+        Py_XDECREF(mod);
+
         if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
             PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
 
@@ -1717,7 +1724,7 @@
             PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
                                            mod != NULL);
 
-        if (ximporttime) {
+        if (ximporttime > 0) {
             _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
 
             import_level--;