diff --git a/great_expectations/dataset/base.py b/great_expectations/dataset/base.py
index 7b6b568bf..d75e3c0e6 100644
--- a/great_expectations/dataset/base.py
+++ b/great_expectations/dataset/base.py
@@ -606,18 +606,38 @@ If you wish to change this behavior, please set discard_failed_expectations, dis
             warnings.warn("WARNING: No great_expectations version found in configuration object.")
 
         for expectation in expectations_config['expectations']:
-            expectation_method = getattr(self, expectation['expectation_type'])
+            try:
+                expectation_method = getattr(self, expectation['expectation_type'])
 
-            if output_format is not None:
-                expectation['kwargs'].update({"output_format": output_format})
+                if output_format is not None:
+                    expectation['kwargs'].update({"output_format": output_format})
 
-            if include_config is not None:
-                expectation['kwargs'].update({"include_config": include_config})
+                if include_config is not None:
+                    expectation['kwargs'].update({"include_config": include_config})
 
-            result = expectation_method(
-                catch_exceptions=catch_exceptions,
-                **expectation['kwargs']
-            )
+                result = expectation_method(
+                    catch_exceptions=catch_exceptions,
+                    **expectation['kwargs']
+                )
+
+            except AttributeError as err:
+                if catch_exceptions:
+                    raised_exception = True
+                    exception_traceback = traceback.format_exc()
+
+                    if output_format != "BOOLEAN_ONLY":
+                        result = {
+                            "success": False, 
+                            "expectation_type": expectation['expectation_type'],
+                            "kwargs": expectation['kwargs'],
+                            "raised_exception": raised_exception, 
+                            "exception_traceback": exception_traceback,
+                        }
+                    else:
+                        result = False
+
+                else:
+                    raise(err)
 
             if output_format != "BOOLEAN_ONLY":
                 results.append(

`Dataset.validate` `catch_exceptions` parameter fails if the `expectation_type` itself is unknown.
Replication code:
```
import great_expectations as ge
my_df = ge.dataset.PandasDataSet({"x":range(10)})
my_df.append_expectation({'expectation_type':'foobar', 'kwargs':{}})
my_df.validate()
```

Produces:
```
In [13]: my_df.validate()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-78271cde7254> in <module>()
----> 1 my_df.validate()

/Users/abe/Documents/superconductive/tools/great_expectations/great_expectations/dataset/base.pyc in validate(self, expectations_config, catch_exceptions, output_format, include_config, only_return_failures)
    607 
    608         for expectation in expectations_config['expectations']:
--> 609             expectation_method = getattr(self, expectation['expectation_type'])
    610 
    611             if output_format is not None:

/Users/abe/anaconda2/lib/python2.7/site-packages/pandas/core/generic.pyc in __getattr__(self, name)
   3612             if name in self._info_axis:
   3613                 return self[name]
-> 3614             return object.__getattribute__(self, name)
   3615 
   3616     def __setattr__(self, name, value):

AttributeError: 'PandasDataSet' object has no attribute 'foobar'
```

I would have expected this to produce something like:
```
{
  "results": [
    {
      "raised_exception": true, 
      "exception_traceback": "Traceback (most recent call last):\n  File \".../great_expectations/great_expectations/dataset/base.py\", line 113, in wrapper\n    return_obj = func(self, **expectation_args)\nValueError: Dataset does not have an expectation method 'foobar'\n", 
      "expectation_type": "foobar", 
      "success": false, 
      "kwargs": {}
    }
  ]
}
```
diff --git a/tests/test_dataset.py b/tests/test_dataset.py
index 39e9407be..eb6870e02 100644
--- a/tests/test_dataset.py
+++ b/tests/test_dataset.py
@@ -994,5 +994,20 @@ class TestDataset(unittest.TestCase):
             self.assertEqual(str(w[0].message),
                              "WARNING: This configuration object was built using a different version of great_expectations than is currently validating it.")
 
+    def test_catch_exceptions_with_bad_expectation_type(self):
+        my_df = ge.dataset.PandasDataSet({"x":range(10)})
+        my_df.append_expectation({'expectation_type':'foobar', 'kwargs':{}})
+        result = my_df.validate(catch_exceptions=True)
+
+        self.assertEqual(result["results"][1]["success"], False)
+        self.assertEqual(result["results"][1]["expectation_type"], "foobar")
+        self.assertEqual(result["results"][1]["kwargs"], {})
+        self.assertEqual(result["results"][1]["raised_exception"], True)
+        assert "AttributeError: \'PandasDataSet\' object has no attribute \'foobar\'" in result["results"][1]["exception_traceback"]
+
+        with self.assertRaises(AttributeError) as context:
+            result = my_df.validate(catch_exceptions=False)
+
+
 if __name__ == "__main__":
     unittest.main()

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
argh==0.27.2
attrs==22.2.0
certifi==2021.5.30
-e git+https://github.com/great-expectations/great_expectations.git@f4b15d20a092fcbef690506f89bddec84b8140ff#egg=great_expectations
importlib-metadata==4.8.3
iniconfig==1.1.1
jsonschema==3.2.0
numpy==1.19.5
packaging==21.3
pandas==1.1.5
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pyrsistent==0.18.0
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
scipy==1.5.4
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
zipp==3.6.0

name: great_expectations
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argh==0.27.2
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - jsonschema==3.2.0
      - numpy==1.19.5
      - packaging==21.3
      - pandas==1.1.5
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pyrsistent==0.18.0
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - scipy==1.5.4
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - zipp==3.6.0
prefix: /opt/conda/envs/great_expectations

tests/test_dataset.py::TestDataset::test_catch_exceptions_with_bad_expectation_type
tests/test_dataset.py::TestDataset::test_test_column_aggregate_expectation_function
tests/test_dataset.py::TestDataset::test_calc_map_expectation_success tests/test_dataset.py::TestDataset::test_dataset tests/test_dataset.py::TestDataset::test_expectation_meta tests/test_dataset.py::TestDataset::test_find_expectations tests/test_dataset.py::TestDataset::test_format_column_map_output tests/test_dataset.py::TestDataset::test_get_and_save_expectation_config tests/test_dataset.py::TestDataset::test_meta_version_warning tests/test_dataset.py::TestDataset::test_remove_expectation tests/test_dataset.py::TestDataset::test_set_default_expectation_argument tests/test_dataset.py::TestDataset::test_test_column_map_expectation_function tests/test_dataset.py::TestDataset::test_test_expectation_function
great_expectations/dataset/base.py
great_expectations/dataset/base.py