BUG: Refine fails with `A value in x_new is above the interpolation range.`
I've encountered the following bug twice in monkeypox CI running in Github Actions:
```
ERROR: Was unable to refine time trees:
augur refine is using TreeTime version 0.9.2

A value in x_new is above the interpolation range.
```

This error seems to be somewhat stochastic, i.e. if I rerun, it will often run successfully after bug.

This seems to be related to the upgrade of tree time from 0.8.6 to 0.9.2 @anna-parker @rneher 

See here for log: https://github.com/nextstrain/monkeypox/runs/7955938588?check_suite_focus=true#step:6:177

Not sure how to reproduce - maybe run the monkeypox CI a few times locally until you get the error?

diff --git a/CHANGES.md b/CHANGES.md
index 284ae830..94943867 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -13,9 +13,11 @@
 * tree: When using IQtree as tre builder, `--nthreads` now sets the maximum number of threads (IQtree argument `-ntmax`). The actual number of threads to use can be specified by the user through the tree-builder-arg `-nt` which defaults to `-nt AUTO`, causing IQtree to automatically chose the best number of threads to use [#1042][] (@corneliusroemer)
 * Make cvxopt as a required dependency, since it is required for titer models to work [#1035][]. (@victorlin)
 * filter: Fix compatibility with Pandas 1.5.0 which could cause an unexpected `AttributeError` with an invalid `--query` given to `augur filter`. [#1050][] (@tsibley)
-
+* refine: Add `--verbosity` argument that is passed down to TreeTime to facilitate monitoring and debugging. [#1033][] (@anna-parker)
+* Improve handling of errors from TreeTime. [#1033][] (@anna-parker)
 
 [#1010]: https://github.com/nextstrain/augur/pull/1010
+[#1033]: https://github.com/nextstrain/augur/pull/1033
 [#1034]: https://github.com/nextstrain/augur/pull/1034
 [#1035]: https://github.com/nextstrain/augur/pull/1035
 [#1042]: https://github.com/nextstrain/augur/pull/1042
diff --git a/augur/__init__.py b/augur/__init__.py
index f5e6be68..ff27fdbf 100644
--- a/augur/__init__.py
+++ b/augur/__init__.py
@@ -9,6 +9,7 @@ import importlib
 import traceback
 from textwrap import dedent
 from types import SimpleNamespace
+from treetime import TreeTimeError, TreeTimeUnknownError
 
 from .errors import AugurError
 from .io import print_err
@@ -72,6 +73,20 @@ def run(argv):
     except FileNotFoundError as e:
         print_err(f"ERROR: {e.strerror}: '{e.filename}'")
         sys.exit(2)
+    except TreeTimeUnknownError as e:
+        print_err(dedent("""\
+            ERROR from TreeTime: An error occurred in TreeTime (see above). This may be due to an issue with TreeTime or Augur.
+            Please report you are calling TreeTime via Augur. 
+            """))
+        sys.exit(2)
+    except TreeTimeError as e:
+        print_err(f"ERROR: {e}")
+        print_err("\n")
+        print_err(dedent("""\
+            ERROR from TreeTime: This error is most likely due to a problem with your input data.
+            Please check your input data and try again. If you continue to have problems, please open a new issue including
+            the original command and the error above:  <https://github.com/nextstrain/augur/issues/new/choose>
+            """))
     except Exception:
         traceback.print_exc(file=sys.stderr)
         print_err("\n")
diff --git a/augur/refine.py b/augur/refine.py
index af5ecb65..f26b3294 100644
--- a/augur/refine.py
+++ b/augur/refine.py
@@ -8,7 +8,7 @@ from .dates import get_numerical_dates
 from .io import read_metadata
 from .utils import read_tree, write_json, InvalidTreeError
 from .errors import AugurError
-from treetime.vcf_utils import read_vcf, write_vcf
+from treetime.vcf_utils import read_vcf
 from treetime.seq_utils import profile_maps
 
 def refine(tree=None, aln=None, ref=None, dates=None, branch_length_inference='auto',
@@ -70,7 +70,7 @@ def refine(tree=None, aln=None, ref=None, dates=None, branch_length_inference='a
     tt.run(infer_gtr=infer_gtr, root=reroot, Tc=Tc, time_marginal=marginal,
            branch_length_mode=branch_length_inference, resolve_polytomies=resolve_polytomies,
            max_iter=max_iter, fixed_pi=fixed_pi, fixed_clock_rate=clock_rate,
-           vary_rate=vary_rate, use_covariation=covariance, **kwarks)
+           vary_rate=vary_rate, use_covariation=covariance, raise_uncaught_exceptions=True, **kwarks)
 
     if confidence:
         for n in tt.tree.find_clades():
@@ -130,6 +130,7 @@ def register_parser(parent_subparsers):
     parser.add_argument('--divergence-units', type=str, choices=['mutations', 'mutations-per-site'],
                         default='mutations-per-site', help='Units in which sequence divergences is exported.')
     parser.add_argument('--seed', type=int, help='seed for random number generation')
+    parser.add_argument('--verbosity', type=int, default=1, help='treetime verbosity, between 0 and 6 (higher values more output)')
     parser.set_defaults(covariance=True)
     return parser
 
@@ -217,18 +218,17 @@ def run(args):
             time_inference_mode = 'always' if args.date_inference=='marginal' else 'only-final'
         else:
             time_inference_mode = 'always' if args.date_inference=='marginal' else 'never'
-        try:
-            tt = refine(tree=T, aln=aln, ref=ref, dates=dates, confidence=args.date_confidence,
-                        reroot=args.root, # or 'best', # We now have a default in param spec - this just adds confusion.
-                        Tc=0.01 if args.coalescent is None else args.coalescent, #use 0.01 as default coalescent time scale
-                        use_marginal = time_inference_mode, use_fft=args.use_fft,
-                        branch_length_inference = args.branch_length_inference or 'auto',
-                        precision = 'auto' if args.precision is None else args.precision,
-                        clock_rate=args.clock_rate, clock_std=args.clock_std_dev,
-                        clock_filter_iqd=args.clock_filter_iqd,
-                        covariance=args.covariance, resolve_polytomies=(not args.keep_polytomies))
-        except BaseException as err:
-            raise AugurError(f"Was unable to refine time trees:\n\n{err}")
+
+        tt = refine(tree=T, aln=aln, ref=ref, dates=dates, confidence=args.date_confidence,
+                    reroot=args.root, # or 'best', # We now have a default in param spec - this just adds confusion.
+                    Tc=0.01 if args.coalescent is None else args.coalescent, #use 0.01 as default coalescent time scale
+                    use_marginal = time_inference_mode, use_fft=args.use_fft,
+                    branch_length_inference = args.branch_length_inference or 'auto',
+                    precision = 'auto' if args.precision is None else args.precision,
+                    clock_rate=args.clock_rate, clock_std=args.clock_std_dev,
+                    clock_filter_iqd=args.clock_filter_iqd,
+                    covariance=args.covariance, resolve_polytomies=(not args.keep_polytomies),
+                    verbosity=args.verbosity)
 
         node_data['clock'] = {'rate': tt.date2dist.clock_rate,
                               'intercept': tt.date2dist.intercept,
@@ -264,7 +264,7 @@ def run(args):
                 except ValueError as err:
                     raise ValueError(f"HINT: This error may be because your specified root with name '{args.root}' was not found in your alignment file") from err
 
-        tt = TreeAnc(tree=T, aln=aln, ref=ref, gtr='JC69', verbose=1)
+        tt = TreeAnc(tree=T, aln=aln, ref=ref, gtr='JC69', verbose=args.verbosity)
 
     node_data['nodes'] = collect_node_data(T, attributes)
     if args.divergence_units=='mutations-per-site': #default
diff --git a/setup.py b/setup.py
index c38788a4..b0c0a015 100644
--- a/setup.py
+++ b/setup.py
@@ -59,7 +59,7 @@ setuptools.setup(
         "networkx >= 2.5, ==2.*",
         "packaging >=19.2",
         "pandas >=1.0.0, ==1.*",
-        "phylo-treetime >=0.9.2, ==0.9.*",
+        "phylo-treetime >=0.9.3, ==0.9.*",
         "xopen >=1.0.1, ==1.*"
     ],
     extras_require = {
['setup.py', 'augur/refine.py', 'CHANGES.md', 'augur/__init__.py']