Description
I'm submitting a...
- bug report
- feature request
Current Behavior
The message
argument to conda.CondaError
sometimes contains user data.
This is problematic since in conda.CondaError.__str__
self.message
is used as a string template.
Steps to Reproduce
|(base) $ conda config --show '%}'
--- Logging error ---
Traceback (most recent call last):
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 743, in __call__
return func(*args, **kwargs)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main.py", line 78, in _main
exit_code = do_call(args, p)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/conda_argparse.py", line 76, in do_call
exit_code = getattr(module, func_name)(args, parser)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main_config.py", line 29, in execute
execute_config(args, parser)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main_config.py", line 111, in execute_config
raise ArgumentError("Invalid configuration parameters: %s" % dashlist(not_params))
conda.exceptions.ArgumentError: <unprintable ArgumentError object>
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/gateways/logging.py", line 64, in emit
msg = self.format(record)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 838, in format
return fmt.format(record)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 575, in format
record.message = record.getMessage()
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 338, in getMessage
msg = msg % self.args
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/__init__.py", line 43, in __repr__
return '%s: %s' % (self.__class__.__name__, text_type(self))
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/__init__.py", line 47, in __str__
return text_type(self.message % self._kwargs)
ValueError: unsupported format character '}' (0x7d) at index 40
Call stack:
File "/home/maba/code/conda/conda-4.4/bin/conda", line 11, in <module>
sys.exit(main())
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/cli/main.py", line 126, in main
return conda_exception_handler(_main, *args)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 975, in conda_exception_handler
return_value = exception_handler(func, *args, **kwargs)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 746, in __call__
return self.handle_exception(exc_val, exc_tb)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 773, in handle_exception
return self.handle_application_exception(exc_val, exc_tb)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 785, in handle_application_exception
self._print_conda_exception(exc_val, exc_tb)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 790, in _print_conda_exception
print_conda_exception(exc_val, exc_tb)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/exceptions.py", line 724, in print_conda_exception
stderrlog.info("\n%r\n", exc_val)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1306, in info
self._log(INFO, msg, args, **kwargs)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1442, in _log
self.handle(record)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1452, in handle
self.callHandlers(record)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 1514, in callHandlers
hdlr.handle(record)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/logging/__init__.py", line 863, in handle
self.emit(record)
File "/home/maba/code/conda/conda-4.4/lib/python3.6/site-packages/conda/gateways/logging.py", line 73, in emit
self.handleError(record)
Unable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
This is even more problematic with Python 2 due to the lost traceback:
|(base) $ conda config --show '%}'
Traceback (most recent call last):
File "/home/maba/code/conda/conda-py2/lib/python2.7/site-packages/conda/gateways/logging.py", line 64, in emit
msg = self.format(record)
File "/home/maba/code/conda/conda-py2/lib/python2.7/logging/__init__.py", line 734, in format
return fmt.format(record)
File "/home/maba/code/conda/conda-py2/lib/python2.7/logging/__init__.py", line 465, in format
record.message = record.getMessage()
File "/home/maba/code/conda/conda-py2/lib/python2.7/logging/__init__.py", line 329, in getMessage
msg = msg % self.args
File "/home/maba/code/conda/conda-py2/lib/python2.7/site-packages/conda/__init__.py", line 43, in __repr__
return '%s: %s' % (self.__class__.__name__, text_type(self))
File "/home/maba/code/conda/conda-py2/lib/python2.7/site-packages/conda/__init__.py", line 47, in __str__
return text_type(self.message % self._kwargs)
ValueError: unsupported format character '}' (0x7d) at index 40
Logged from file exceptions.py, line 724
Expected Behavior
Every single use of conda.CondaError
and derived classes must be reviewed to make sure conda.CondaError.message
only ever contains static strings without user data.
Also, it would be best to make sure conda.CondaError.__str__
never fails, i.e., do not only except TypeError
but catch other exceptions too and prefer to rather output anything instead of nothing, e.g.
except:
sys.stderr.write("\n".join(map(str, [self.message, self._kwargs, ""])))
raise
(or something even simpler that is least likely to fail).
As for the lost tracebacks with Python 2, some possibilities are
- maybe always use something like future.utils for raising exceptions,
- tell users to use Miniconda3/Anaconda3 and use Python 2 only in a non-
base
environments, - ditch Python 2 support with
conda 5.*
(meaning only Python 3-onlybase
/_conda_
environments) 😉.
Environment Information
`conda info`
active environment : base
active env location : /home/maba/code/conda/conda-4.4
shell level : 1
user config file : /home/maba/.condarc
populated config files : /home/maba/code/conda/conda-4.4/.condarc
conda version : 4.4.7
conda-build version : not installed
python version : 3.6.4.final.0
base environment : /home/maba/code/conda/conda-4.4 (writable)
channel URLs : https://repo.continuum.io/pkgs/main/linux-64
https://repo.continuum.io/pkgs/main/noarch
https://repo.continuum.io/pkgs/free/linux-64
https://repo.continuu
7288
m.io/pkgs/free/noarch
https://repo.continuum.io/pkgs/r/linux-64
https://repo.continuum.io/pkgs/r/noarch
https://repo.continuum.io/pkgs/pro/linux-64
https://repo.continuum.io/pkgs/pro/noarch
package cache : /home/maba/code/conda/conda-4.4/pkgs
/home/maba/.conda/pkgs
envs directories : /home/maba/code/conda/conda-4.4/envs
/home/maba/.conda/envs
platform : linux-64
user-agent : conda/4.4.7 requests/2.18.4 CPython/3.6.4 Linux/4.14.13-1-MANJARO manjaro/17.1-dev glibc/2.26
UID:GID : 1000:1000
netrc file : None
offline mode : False
`conda config --show-sources`
==> /home/maba/code/conda/conda-4.4/.condarc <==
pinned_packages:
- conda >=4.4,<4.5.0a0
`conda list --show-channel-urls`
# packages in environment at /home/maba/code/conda/conda-4.4:
#
asn1crypto 0.24.0 py36_0 defaults
ca-certificates 2017.08.26 h1d4fec5_0 defaults
certifi 2017.11.5 py36hf29ccca_0 defaults
cffi 1.11.4 py36h9745a5d_0 defaults
chardet 3.0.4 py36h0f667ec_1 defaults
conda 4.4.7 py36_0 defaults
conda-env 2.6.0 h36134e3_1 defaults
cryptography 2.1.4 py36hd09be54_0 defaults
idna 2.6 py36h82fb2a8_1 defaults
libedit 3.1 heed3624_0 defaults
libffi 3.2.1 hd88cf55_4 defaults
libgcc-ng 7.2.0 h7cc24e2_2 defaults
libstdcxx-ng 7.2.0 h7a57d05_2 defaults
ncurses 6.0 h9df7e31_2 defaults
openssl 1.0.2n hb7f436b_0 defaults
pip 9.0.1 py36h6c6f9ce_4 defaults
pycosat 0.6.3 py36h0a5515d_0 defaults
pycparser 2.18 py36hf9f622e_1 defaults
pyopenssl 17.5.0 py36h20ba746_0 defaults
pysocks 1.6.7 py36hd97a5b1_1 defaults
python 3.6.4 hc3d631a_1 defaults
readline 7.0 ha6073c6_4 defaults
requests 2.18.4 py36he2e5f8d_1 defaults
ruamel_yaml 0.15.35 py36h14c3975_1 defaults
setuptools 38.4.0 py36_0 defaults
six 1.11.0 py36h372c433_1 defaults
sqlite 3.20.1 hb898158_2 defaults
tk 8.6.7 hc745277_3 defaults
urllib3 1.22 py36hbe7ace6_0 defaults
wheel 0.30.0 py36hfd4bba0_1 defaults
xz 5.2.3 h55aa19d_2 defaults
yaml 0.1.7 had09818_2 defaults
zlib 1.2.11 ha838bed_2 defaults