(Too long for comments ..)
Adding to Miguel-F comments on CF "unscrupulousness" ... according to the documentation, IsStruct uses the following rules (my attention):
Returns True if the variable is a ColdFusion structure or is a Java object that implements the java.lang.Map interface . Return value False if the object in the variable is a user-defined function (UDF).
CFCatch does not meet these criteria. Therefore, why IsStruct returns false.
If you CFCatch object and examine the class hierarchy, you will see that it is actually implemented as a subclass of java.lang.Exception :
coldfusion.runtime.DivideByZeroException coldfusion.runtime.ExpressionException coldfusion.runtime.NeoException java.lang.RuntimeException java.lang.Exception java.lang.Throwable java.lang.Object
... not coldfusion.runtime.struct i.e. CF structure:
coldfusion.runtime.Struct coldfusion.util.FastHashtable coldfusion.util.CaseInsensitiveMap java.lang.Object
So, as Miguel-F said , although it can be used as a structure (like the most complex object), it is technically not a CF structure, which explains why IsStruct returns false.
Aside, the reason you can access your properties using dot notation, for example with CF structures, is probably because the cfcatch class uses the JavaBean pattern :
ColdFusion can automatically call get_PropertyName_ () and set_PropertyName_ (value) if the Java class matches the JavaBeans pattern. As a result, you can set or get referring to it directly, without explicitly calling the method.
So, for example, you can access the "message" cfcatch property using:
cfcatch.message
.. instead of calling its getter method for this property:
cfcatch.getMessage()