# Buggy code
def _construct_parser(self, fname):
    # type: (str) -> RawConfigParser
    parser = configparser.RawConfigParser()
    # If there is no such file, don't bother reading it but create the
    # parser anyway, to hold the data.
    # Doing this is useful when modifying and saving files, where we don't
    # need to construct a parser.
    if os.path.exists(fname):
        parser.read(fname)

    return parser


# Traceback (UnicodeDecodeError)
C:\Users\cyl>pip list
Traceback (most recent call last):
File "C:\Users\cyl\AppData\Local\Programs\Python\Python35\Scripts\pip-script.py", line 11, in <module>
load_entry_point('pip==10.0.0.dev0', 'console_scripts', 'pip')()
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\__init__.py", line 229, in main
cmd_name, cmd_args = parseopts(args)
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\__init__.py", line 178, in parseopts
general_options, args_else = parser.parse_args(args)
File "C:\Users\cyl\AppData\Local\Programs\Python\Python35\lib\optparse.py", line 1370, in parse_args
values = self.get_default_values()
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\baseparser.py", line 227, in get_default_values
defaults = self._update_defaults(self.defaults.copy())  # ours
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\baseparser.py", line 181, in _update_defaults
self.config.load()
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\configuration.py", line 111, in load
self._load_config_files()
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\configuration.py", line 262, in _load_config_files
parser = self._load_file(variant, fname)
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\configuration.py", line 270, in _load_file
parser = self._construct_parser(fname)
File "c:\users\cyl\appdata\local\programs\python\python35\lib\site-packages\pip-10.0.0.dev0-py3.5.egg\pip\_internal\configuration.py", line 286, in _construct_parser
parser.read(fname)
File "C:\Users\cyl\AppData\Local\Programs\Python\Python35\lib\configparser.py", line 696, in read
self._read(fp, filename)
File "C:\Users\cyl\AppData\Local\Programs\Python\Python35\lib\configparser.py", line 1012, in _read
for lineno, line in enumerate(fp, start=1):
UnicodeDecodeError: 'gbk' codec can't decode byte 0x90 in position 101: illegal multibyte sequence

# Fixed code
def _construct_parser(self, fname):
    # type: (str) -> RawConfigParser
    parser = configparser.RawConfigParser()
    # If there is no such file, don't bother reading it but create the
    # parser anyway, to hold the data.
    # Doing this is useful when modifying and saving files, where we don't
    # need to construct a parser.
    if os.path.exists(fname):
        try:
            parser.read(fname)
        except UnicodeDecodeError:
            raise ConfigurationError(
                (
                    "ERROR: "
                    "Configuration file contains invalid %s characters.\n"
                    "Please fix your configuration, located at %s\n"
                )
                % (locale.getpreferredencoding(False), fname)
            )
    return parser