I would agree with the Error class way, but it should be a collection of errors. LV is parallel - we need a way to merge errors into a single wire without losing information. Once you do that, you can have the base error class with the items Chris suggested, but add specific data for specific error handlers (thus there's no need for the custom properties variant).
It would be great (actually, it would probably be a basic requirement) if LV was smart enough to coerce error wires into such an object, so that we have backward compatibility.