diff --git a/stix2/v20/observables.py b/stix2/v20/observables.py
index 36def28..faa5868 100644
--- a/stix2/v20/observables.py
+++ b/stix2/v20/observables.py
@@ -73,26 +73,23 @@ class ExtensionsProperty(DictionaryProperty):
         if dictified == {}:
             raise ValueError("The extensions property must contain a non-empty dictionary")
 
-        if self.enclosing_type in EXT_MAP:
-            specific_type_map = EXT_MAP[self.enclosing_type]
-            for key, subvalue in dictified.items():
-                if key in specific_type_map:
-                    cls = specific_type_map[key]
-                    if type(subvalue) is dict:
-                        if self.allow_custom:
-                            subvalue['allow_custom'] = True
-                            dictified[key] = cls(**subvalue)
-                        else:
-                            dictified[key] = cls(**subvalue)
-                    elif type(subvalue) is cls:
-                        # If already an instance of an _Extension class, assume it's valid
-                        dictified[key] = subvalue
+        specific_type_map = EXT_MAP.get(self.enclosing_type, {})
+        for key, subvalue in dictified.items():
+            if key in specific_type_map:
+                cls = specific_type_map[key]
+                if type(subvalue) is dict:
+                    if self.allow_custom:
+                        subvalue['allow_custom'] = True
+                        dictified[key] = cls(**subvalue)
                     else:
-                        raise ValueError("Cannot determine extension type.")
+                        dictified[key] = cls(**subvalue)
+                elif type(subvalue) is cls:
+                    # If already an instance of an _Extension class, assume it's valid
+                    dictified[key] = subvalue
                 else:
-                    raise CustomContentError("Can't parse unknown extension type: {}".format(key))
-        else:
-            raise ValueError("The enclosing type '%s' has no extensions defined" % self.enclosing_type)
+                    raise ValueError("Cannot determine extension type.")
+            else:
+                raise CustomContentError("Can't parse unknown extension type: {}".format(key))
         return dictified
 
 

diff --git a/stix2/test/test_custom.py b/stix2/test/test_custom.py
index 18ad03a..18b8f18 100644
--- a/stix2/test/test_custom.py
+++ b/stix2/test/test_custom.py
@@ -826,9 +826,10 @@ def test_parse_observable_with_custom_extension():
     assert parsed.extensions['x-new-ext'].property2 == 12
 
 
-def test_parse_observable_with_unregistered_custom_extension():
-    input_str = """{
-        "type": "domain-name",
+@pytest.mark.parametrize("data", [
+    # URL is not in EXT_MAP
+    """{
+        "type": "url",
         "value": "example.com",
         "extensions": {
             "x-foobar-ext": {
@@ -836,13 +837,25 @@ def test_parse_observable_with_unregistered_custom_extension():
                 "property2": 12
             }
         }
-    }"""
-
+    }""",
+    # File is in EXT_MAP
+    """{
+        "type": "file",
+        "name": "foo.txt",
+        "extensions": {
+            "x-foobar-ext": {
+                "property1": "foo",
+                "property2": 12
+            }
+        }
+    }""",
+])
+def test_parse_observable_with_unregistered_custom_extension(data):
     with pytest.raises(ValueError) as excinfo:
-        stix2.parse_observable(input_str)
+        stix2.parse_observable(data)
     assert "Can't parse unknown extension type" in str(excinfo.value)
 
-    parsed_ob = stix2.parse_observable(input_str, allow_custom=True)
+    parsed_ob = stix2.parse_observable(data, allow_custom=True)
     assert parsed_ob['extensions']['x-foobar-ext']['property1'] == 'foo'
     assert not isinstance(parsed_ob['extensions']['x-foobar-ext'], stix2.core._STIXBase)
 
diff --git a/stix2/test/test_properties.py b/stix2/test/test_properties.py
index 1106bcb..19419bb 100644
--- a/stix2/test/test_properties.py
+++ b/stix2/test/test_properties.py
@@ -412,7 +412,7 @@ def test_extension_property_invalid_type():
                 'pe_type': 'exe'
             }}
         )
-    assert 'no extensions defined' in str(excinfo.value)
+    assert "Can't parse unknown extension" in str(excinfo.value)
 
 
 def test_extension_at_least_one_property_constraint():

stix2.exceptions.InvalidValueError: Invalid value for ObservedData 'objects': Invalid value for URL 'extensions': The enclosing type 'url' has no extensions defined
According to the [stix2 standard](http://docs.oasis-open.org/cti/stix/v2.0/cs01/part4-cyber-observable-objects/stix-v2.0-cs01-part4-cyber-observable-objects.html#_Toc496716284), URL observables have `extensions` Common Properties. But I encountered this error when I tried to add a custom extension to a URL observable.
stix2/test/test_custom.py::test_parse_observable_with_unregistered_custom_extension[{\n stix2/test/test_properties.py::test_id_property_not_a_valid_hex_uuid[my-type--5b9ea668-5777-11ef-a777-fa3cdcf14c24] stix2/test/test_properties.py::test_extension_property_invalid_type
stix2/test/test_custom.py::test_identity_custom_property stix2/test/test_custom.py::test_identity_custom_property_invalid stix2/test/test_custom.py::test_identity_custom_property_allowed stix2/test/test_custom.py::test_parse_identity_custom_property[{\n stix2/test/test_custom.py::test_custom_property_object_in_bundled_object stix2/test/test_custom.py::test_custom_properties_object_in_bundled_object stix2/test/test_custom.py::test_custom_property_dict_in_bundled_object stix2/test/test_custom.py::test_custom_properties_dict_in_bundled_object stix2/test/test_custom.py::test_custom_property_in_observed_data stix2/test/test_custom.py::test_custom_property_object_in_observable_extension stix2/test/test_custom.py::test_custom_property_dict_in_observable_extension stix2/test/test_custom.py::test_identity_custom_property_revoke stix2/test/test_custom.py::test_identity_custom_property_edit_markings stix2/test/test_custom.py::test_custom_marking_no_init_1 stix2/test/test_custom.py::test_custom_marking_no_init_2 stix2/test/test_custom.py::test_custom_object_raises_exception stix2/test/test_custom.py::test_custom_object_type stix2/test/test_custom.py::test_custom_object_no_init_1 stix2/test/test_custom.py::test_custom_object_no_init_2 stix2/test/test_custom.py::test_custom_object_invalid_type_name stix2/test/test_custom.py::test_parse_custom_object_type stix2/test/test_custom.py::test_parse_unregistered_custom_object_type stix2/test/test_custom.py::test_parse_unregistered_custom_object_type_w_allow_custom stix2/test/test_custom.py::test_custom_observable_object_1 stix2/test/test_custom.py::test_custom_observable_object_2 stix2/test/test_custom.py::test_custom_observable_object_3 stix2/test/test_custom.py::test_custom_observable_raises_exception stix2/test/test_custom.py::test_custom_observable_object_no_init_1 stix2/test/test_custom.py::test_custom_observable_object_no_init_2 stix2/test/test_custom.py::test_custom_observable_object_invalid_type_name stix2/test/test_custom.py::test_custom_observable_object_invalid_ref_property stix2/test/test_custom.py::test_custom_observable_object_invalid_refs_property stix2/test/test_custom.py::test_custom_observable_object_invalid_refs_list_property stix2/test/test_custom.py::test_custom_observable_object_invalid_valid_refs stix2/test/test_custom.py::test_custom_no_properties_raises_exception stix2/test/test_custom.py::test_custom_wrong_properties_arg_raises_exception stix2/test/test_custom.py::test_parse_custom_observable_object stix2/test/test_custom.py::test_parse_unregistered_custom_observable_object stix2/test/test_custom.py::test_parse_unregistered_custom_observable_object_with_no_type stix2/test/test_custom.py::test_parse_observed_data_with_custom_observable stix2/test/test_custom.py::test_parse_invalid_custom_observable_object stix2/test/test_custom.py::test_observable_custom_property stix2/test/test_custom.py::test_observable_custom_property_invalid stix2/test/test_custom.py::test_observable_custom_property_allowed stix2/test/test_custom.py::test_observed_data_with_custom_observable_object stix2/test/test_custom.py::test_custom_extension_raises_exception stix2/test/test_custom.py::test_custom_extension stix2/test/test_custom.py::test_custom_extension_wrong_observable_type stix2/test/test_custom.py::test_custom_extension_with_list_and_dict_properties_observable_type[{\n stix2/test/test_custom.py::test_custom_extension_invalid_observable stix2/test/test_custom.py::test_custom_extension_invalid_type_name stix2/test/test_custom.py::test_custom_extension_no_properties stix2/test/test_custom.py::test_custom_extension_empty_properties stix2/test/test_custom.py::test_custom_extension_dict_properties stix2/test/test_custom.py::test_custom_extension_no_init_1 stix2/test/test_custom.py::test_custom_extension_no_init_2 stix2/test/test_custom.py::test_parse_observable_with_custom_extension stix2/test/test_custom.py::test_register_custom_object stix2/test/test_custom.py::test_extension_property_location stix2/test/test_custom.py::test_custom_object_nested_dictionary[{\n stix2/test/test_properties.py::test_property stix2/test/test_properties.py::test_basic_clean stix2/test/test_properties.py::test_property_default stix2/test/test_properties.py::test_fixed_property stix2/test/test_properties.py::test_list_property stix2/test/test_properties.py::test_string_property stix2/test/test_properties.py::test_type_property stix2/test/test_properties.py::test_id_property_valid[my-type--232c9d3f-49fc-4440-bb01-607f638778e7] stix2/test/test_properties.py::test_id_property_valid[my-type--00000000-0000-4000-8000-000000000000] stix2/test/test_properties.py::test_id_property_valid_for_type[attack-pattern--0c7b5b88-8ff7-4a4d-aa9d-feb398cd0061] stix2/test/test_properties.py::test_id_property_valid_for_type[campaign--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f] stix2/test/test_properties.py::test_id_property_valid_for_type[course-of-action--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f] stix2/test/test_properties.py::test_id_property_valid_for_type[identity--311b2d2d-f010-4473-83ec-1edf84858f4c] stix2/test/test_properties.py::test_id_property_valid_for_type[indicator--a740531e-63ff-4e49-a9e1-a0a3eed0e3e7] stix2/test/test_properties.py::test_id_property_valid_for_type[intrusion-set--4e78f46f-a023-4e5f-bc24-71b3ca22ec29] stix2/test/test_properties.py::test_id_property_valid_for_type[malware--9c4638ec-f1de-4ddb-abf4-1b760417654e] stix2/test/test_properties.py::test_id_property_valid_for_type[marking-definition--613f2e26-407d-48c7-9eca-b8e91df99dc9_0] stix2/test/test_properties.py::test_id_property_valid_for_type[observed-data--b67d30ff-02ac-498a-92f9-32f845f448cf] stix2/test/test_properties.py::test_id_property_valid_for_type[relationship--df7c87eb-75d2-4948-af81-9d49d246f301] stix2/test/test_properties.py::test_id_property_valid_for_type[report--84e4d88f-44ea-4bcd-bbf3-b2c1c320bcb3] stix2/test/test_properties.py::test_id_property_valid_for_type[sighting--bfbc19db-ec35-4e45-beed-f8bde2a772fb] stix2/test/test_properties.py::test_id_property_valid_for_type[threat-actor--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f] stix2/test/test_properties.py::test_id_property_valid_for_type[tool--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f] stix2/test/test_properties.py::test_id_property_valid_for_type[vulnerability--0c7b5b88-8ff7-4a4d-aa9d-feb398cd0061] stix2/test/test_properties.py::test_id_property_valid_for_type[marking-definition--613f2e26-407d-48c7-9eca-b8e91df99dc9_1] stix2/test/test_properties.py::test_id_property_valid_for_type[marking-definition--443eb5c3-a76c-4a0a-8caa-e93998e7bc09] stix2/test/test_properties.py::test_id_property_valid_for_type[marking-definition--57fcd772-9c1d-41b0-8d1f-3d47713415d9] stix2/test/test_properties.py::test_id_property_valid_for_type[marking-definition--462bf1a6-03d2-419c-b74e-eee2238b2de4] stix2/test/test_properties.py::test_id_property_valid_for_type[marking-definition--68520ae2-fefe-43a9-84ee-2c2a934d2c7d] stix2/test/test_properties.py::test_id_property_valid_for_type[marking-definition--2802dfb1-1019-40a8-8848-68d0ec0e417f] stix2/test/test_properties.py::test_id_property_valid_for_type[relationship--06520621-5352-4e6a-b976-e8fa3d437ffd] stix2/test/test_properties.py::test_id_property_valid_for_type[relationship--181c9c09-43e6-45dd-9374-3bec192f05ef] stix2/test/test_properties.py::test_id_property_valid_for_type[relationship--a0cbb21c-8daf-4a7f-96aa-7155a4ef8f70] stix2/test/test_properties.py::test_id_property_wrong_type stix2/test/test_properties.py::test_id_property_not_a_valid_hex_uuid[my-type--foo] stix2/test/test_properties.py::test_id_property_not_a_valid_hex_uuid[my-type--00000000-0000-0000-0000-000000000000] stix2/test/test_properties.py::test_id_property_not_a_valid_hex_uuid[my-type--04738bdf-b25a-3829-a801-b21a1d25095b] stix2/test/test_properties.py::test_id_property_not_a_valid_hex_uuid[my-type--aad03681-8b63-5304-89e0-8ca8f49461b5] stix2/test/test_properties.py::test_id_property_default stix2/test/test_properties.py::test_integer_property_valid[2] stix2/test/test_properties.py::test_integer_property_valid[-1] stix2/test/test_properties.py::test_integer_property_valid[3.14] stix2/test/test_properties.py::test_integer_property_valid[False] stix2/test/test_properties.py::test_integer_property_invalid[something] stix2/test/test_properties.py::test_integer_property_invalid[value1] stix2/test/test_properties.py::test_float_property_valid[2] stix2/test/test_properties.py::test_float_property_valid[-1] stix2/test/test_properties.py::test_float_property_valid[3.14] stix2/test/test_properties.py::test_float_property_valid[False] stix2/test/test_properties.py::test_float_property_invalid[something] stix2/test/test_properties.py::test_float_property_invalid[value1] stix2/test/test_properties.py::test_boolean_property_valid[True0] stix2/test/test_properties.py::test_boolean_property_valid[False0] stix2/test/test_properties.py::test_boolean_property_valid[True1] stix2/test/test_properties.py::test_boolean_property_valid[False1] stix2/test/test_properties.py::test_boolean_property_valid[true] stix2/test/test_properties.py::test_boolean_property_valid[false] stix2/test/test_properties.py::test_boolean_property_valid[TRUE] stix2/test/test_properties.py::test_boolean_property_valid[FALSE] stix2/test/test_properties.py::test_boolean_property_valid[T] stix2/test/test_properties.py::test_boolean_property_valid[F] stix2/test/test_properties.py::test_boolean_property_valid[t] stix2/test/test_properties.py::test_boolean_property_valid[f] stix2/test/test_properties.py::test_boolean_property_valid[1] stix2/test/test_properties.py::test_boolean_property_valid[0] stix2/test/test_properties.py::test_boolean_property_invalid[abc] stix2/test/test_properties.py::test_boolean_property_invalid[value1] stix2/test/test_properties.py::test_boolean_property_invalid[value2] stix2/test/test_properties.py::test_boolean_property_invalid[2] stix2/test/test_properties.py::test_boolean_property_invalid[-1] stix2/test/test_properties.py::test_reference_property stix2/test/test_properties.py::test_timestamp_property_valid[2017-01-01T12:34:56Z] stix2/test/test_properties.py::test_timestamp_property_valid[2017-01-01 stix2/test/test_properties.py::test_timestamp_property_valid[Jan stix2/test/test_properties.py::test_timestamp_property_invalid stix2/test/test_properties.py::test_binary_property stix2/test/test_properties.py::test_hex_property stix2/test/test_properties.py::test_dictionary_property_valid[d0] stix2/test/test_properties.py::test_dictionary_property_valid[d1] stix2/test/test_properties.py::test_dictionary_property_invalid_key[d0] stix2/test/test_properties.py::test_dictionary_property_invalid_key[d1] stix2/test/test_properties.py::test_dictionary_property_invalid_key[d2] stix2/test/test_properties.py::test_dictionary_property_invalid[d0] stix2/test/test_properties.py::test_dictionary_property_invalid[d1] stix2/test/test_properties.py::test_property_list_of_dictionary stix2/test/test_properties.py::test_hashes_property_valid[value1] stix2/test/test_properties.py::test_hashes_property_invalid[value0] stix2/test/test_properties.py::test_hashes_property_invalid[value1] stix2/test/test_properties.py::test_embedded_property stix2/test/test_properties.py::test_enum_property_valid[value0] stix2/test/test_properties.py::test_enum_property_valid[value1] stix2/test/test_properties.py::test_enum_property_valid[b] stix2/test/test_properties.py::test_enum_property_invalid stix2/test/test_properties.py::test_extension_property_valid stix2/test/test_properties.py::test_extension_property_invalid[1] stix2/test/test_properties.py::test_extension_property_invalid[data1] stix2/test/test_properties.py::test_extension_at_least_one_property_constraint