# Buggy code
def __init__(
    self,
    srcdir: str,
    confdir: str,
    outdir: str,
    doctreedir: str,
    buildername: str,
    confoverrides: Dict = None,
    status: IO = sys.stdout,
    warning: IO = sys.stderr,
    freshenv: bool = False,
    warningiserror: bool = False,
    tags: List[str] = None,
    verbosity: int = 0,
    parallel: int = 0,
    keep_going: bool = False,
) -> None:
    self.phase = BuildPhase.INITIALIZATION
    self.verbosity = verbosity
    self.extensions = {}  # type: Dict[str, Extension]
    self.builder = None  # type: Builder
    self.env = None  # type: BuildEnvironment
    self.project = None  # type: Project
    self.registry = SphinxComponentRegistry()
    self.html_themes = {}  # type: Dict[str, str]

    # validate provided directories
    self.srcdir = abspath(srcdir)
    self.outdir = abspath(outdir)
    self.doctreedir = abspath(doctreedir)
    self.confdir = confdir
    if self.confdir:  # confdir is optional
        self.confdir = abspath(self.confdir)
        if not path.isfile(path.join(self.confdir, "conf.py")):
            raise ApplicationError(
                __("config directory doesn't contain a conf.py file (%s)") % confdir
            )

    if not path.isdir(self.srcdir):
        raise ApplicationError(__("Cannot find source directory (%s)") % self.srcdir)

    if self.srcdir == self.outdir:
        raise ApplicationError(
            __("Source directory and destination directory cannot be identical")
        )

    self.parallel = parallel

    if status is None:
        self._status = StringIO()  # type: IO
        self.quiet = True
    else:
        self._status = status
        self.quiet = False

    if warning is None:
        self._warning = StringIO()  # type: IO
    else:
        self._warning = warning
    self._warncount = 0
    self.keep_going = warningiserror and keep_going
    if self.keep_going:
        self.warningiserror = False
    else:
        self.warningiserror = warningiserror
    logging.setup(self, self._status, self._warning)

    self.events = EventManager(self)

    # keep last few messages for traceback
    # This will be filled by sphinx.util.logging.LastMessagesWriter
    self.messagelog = deque(maxlen=10)  # type: deque

    # say hello to the world
    logger.info(bold(__("Running Sphinx v%s") % sphinx.__display_version__))

    # notice for parallel build on macOS and py38+
    if sys.version_info > (3, 8) and platform.system() == "Darwin" and parallel > 1:
        logger.info(
            bold(
                __(
                    "For security reason, parallel mode is disabled on macOS and "
                    "python3.8 and above.  For more details, please read "
                    "https://github.com/sphinx-doc/sphinx/issues/6803"
                )
            )
        )

    # status code for command-line application
    self.statuscode = 0

    # read config
    self.tags = Tags(tags)
    if self.confdir is None:
        self.config = Config({}, confoverrides or {})
    else:
        self.config = Config.read(self.confdir, confoverrides or {}, self.tags)

    # initialize some limited config variables before initialize i18n and loading
    # extensions
    self.config.pre_init_values()

    # set up translation infrastructure
    self._init_i18n()

    # check the Sphinx version if requested
    if (
        self.config.needs_sphinx
        and self.config.needs_sphinx > sphinx.__display_version__
    ):
        raise VersionRequirementError(
            __(
                "This project needs at least Sphinx v%s and therefore cannot "
                "be built with this version."
            )
            % self.config.needs_sphinx
        )

    # set confdir to srcdir if -C given (!= no confdir); a few pieces
    # of code expect a confdir to be set
    if self.confdir is None:
        self.confdir = self.srcdir

    # load all built-in extension modules
    for extension in builtin_extensions:
        self.setup_extension(extension)

    # load all user-given extension modules
    for extension in self.config.extensions:
        self.setup_extension(extension)

    # preload builder module (before init config values)
    self.preload_builder(buildername)

    if not path.isdir(outdir):
        with progress_message(__("making output directory")):
            ensuredir(outdir)

    # the config file itself can be an extension
    if self.config.setup:
        prefix = __("while setting up extension %s:") % "conf.py"
        with prefixed_warnings(prefix):
            if callable(self.config.setup):
                self.config.setup(self)
            else:
                raise ConfigError(
                    __(
                        "'setup' as currently defined in conf.py isn't a Python callable. "
                        "Please modify its definition to make it a callable function. "
                        "This is needed for conf.py to behave as a Sphinx extension."
                    )
                )

    # now that we know all config values, collect them from conf.py
    self.config.init_values()
    self.events.emit("config-inited", self.config)

    # create the project
    self.project = Project(self.srcdir, self.config.source_suffix)
    # create the builder
    self.builder = self.create_builder(buildername)
    # set up the build environment
    self._init_env(freshenv)
    # set up the builder
    self._init_builder()


# Traceback (FileExistsError)
making output directory... failed

Traceback (most recent call last):
File "/Users/Example/.virtualenvs/prawdditions/venv/lib/python3.7/site-packages/sphinx/cmd/build.py", line 275, in build_main
args.tags, args.verbosity, args.jobs, args.keep_going)
File "/Users/Example/.virtualenvs/prawdditions/venv/lib/python3.7/site-packages/sphinx/application.py", line 252, in __init__
ensuredir(outdir)
File "/Users/Example/.virtualenvs/prawdditions/venv/lib/python3.7/site-packages/sphinx/util/osutil.py", line 84, in ensuredir
os.makedirs(path, exist_ok=True)
File "/usr/local/opt/python/bin/../Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 223, in makedirs
mkdir(name, mode)
FileExistsError: [Errno 17] File exists: '/tmp/test'

Exception occurred:
File "/usr/local/opt/python/bin/../Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 223, in makedirs
mkdir(name, mode)
FileExistsError: [Errno 17] File exists: '/tmp/test'
The full traceback has been saved in /var/folders/_b/lxdb2n41733bg22l3cbkw1c80000gp/T/sphinx-err-hb2vsnb1.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
A bug report can be filed in the tracker at <https://github.com/sphinx-doc/sphinx/issues>. Thanks!

# Fixed code
def __init__(
    self,
    srcdir: str,
    confdir: str,
    outdir: str,
    doctreedir: str,
    buildername: str,
    confoverrides: Dict = None,
    status: IO = sys.stdout,
    warning: IO = sys.stderr,
    freshenv: bool = False,
    warningiserror: bool = False,
    tags: List[str] = None,
    verbosity: int = 0,
    parallel: int = 0,
    keep_going: bool = False,
) -> None:
    self.phase = BuildPhase.INITIALIZATION
    self.verbosity = verbosity
    self.extensions = {}  # type: Dict[str, Extension]
    self.builder = None  # type: Builder
    self.env = None  # type: BuildEnvironment
    self.project = None  # type: Project
    self.registry = SphinxComponentRegistry()
    self.html_themes = {}  # type: Dict[str, str]

    # validate provided directories
    self.srcdir = abspath(srcdir)
    self.outdir = abspath(outdir)
    self.doctreedir = abspath(doctreedir)
    self.confdir = confdir
    if self.confdir:  # confdir is optional
        self.confdir = abspath(self.confdir)
        if not path.isfile(path.join(self.confdir, "conf.py")):
            raise ApplicationError(
                __("config directory doesn't contain a conf.py file (%s)") % confdir
            )

    if not path.isdir(self.srcdir):
        raise ApplicationError(__("Cannot find source directory (%s)") % self.srcdir)

    if path.exists(self.outdir) and not path.isdir(self.outdir):
        raise ApplicationError(
            __("Output directory (%s) is not a directory") % self.srcdir
        )

    if self.srcdir == self.outdir:
        raise ApplicationError(
            __("Source directory and destination directory cannot be identical")
        )

    self.parallel = parallel

    if status is None:
        self._status = StringIO()  # type: IO
        self.quiet = True
    else:
        self._status = status
        self.quiet = False

    if warning is None:
        self._warning = StringIO()  # type: IO
    else:
        self._warning = warning
    self._warncount = 0
    self.keep_going = warningiserror and keep_going
    if self.keep_going:
        self.warningiserror = False
    else:
        self.warningiserror = warningiserror
    logging.setup(self, self._status, self._warning)

    self.events = EventManager(self)

    # keep last few messages for traceback
    # This will be filled by sphinx.util.logging.LastMessagesWriter
    self.messagelog = deque(maxlen=10)  # type: deque

    # say hello to the world
    logger.info(bold(__("Running Sphinx v%s") % sphinx.__display_version__))

    # notice for parallel build on macOS and py38+
    if sys.version_info > (3, 8) and platform.system() == "Darwin" and parallel > 1:
        logger.info(
            bold(
                __(
                    "For security reason, parallel mode is disabled on macOS and "
                    "python3.8 and above.  For more details, please read "
                    "https://github.com/sphinx-doc/sphinx/issues/6803"
                )
            )
        )

    # status code for command-line application
    self.statuscode = 0

    # read config
    self.tags = Tags(tags)
    if self.confdir is None:
        self.config = Config({}, confoverrides or {})
    else:
        self.config = Config.read(self.confdir, confoverrides or {}, self.tags)

    # initialize some limited config variables before initialize i18n and loading
    # extensions
    self.config.pre_init_values()

    # set up translation infrastructure
    self._init_i18n()

    # check the Sphinx version if requested
    if (
        self.config.needs_sphinx
        and self.config.needs_sphinx > sphinx.__display_version__
    ):
        raise VersionRequirementError(
            __(
                "This project needs at least Sphinx v%s and therefore cannot "
                "be built with this version."
            )
            % self.config.needs_sphinx
        )

    # set confdir to srcdir if -C given (!= no confdir); a few pieces
    # of code expect a confdir to be set
    if self.confdir is None:
        self.confdir = self.srcdir

    # load all built-in extension modules
    for extension in builtin_extensions:
        self.setup_extension(extension)

    # load all user-given extension modules
    for extension in self.config.extensions:
        self.setup_extension(extension)

    # preload builder module (before init config values)
    self.preload_builder(buildername)

    if not path.isdir(outdir):
        with progress_message(__("making output directory")):
            ensuredir(outdir)

    # the config file itself can be an extension
    if self.config.setup:
        prefix = __("while setting up extension %s:") % "conf.py"
        with prefixed_warnings(prefix):
            if callable(self.config.setup):
                self.config.setup(self)
            else:
                raise ConfigError(
                    __(
                        "'setup' as currently defined in conf.py isn't a Python callable. "
                        "Please modify its definition to make it a callable function. "
                        "This is needed for conf.py to behave as a Sphinx extension."
                    )
                )

    # now that we know all config values, collect them from conf.py
    self.config.init_values()
    self.events.emit("config-inited", self.config)

    # create the project
    self.project = Project(self.srcdir, self.config.source_suffix)
    # create the builder
    self.builder = self.create_builder(buildername)
    # set up the build environment
    self._init_env(freshenv)
    # set up the builder
    self._init_builder()