Should all traps always be defined?

Yes, it's a good idea - the only downside is a bit of extra code size, and you have to decide what to do with the trap (emit a message on the serial port? turn on a "FAILED" light? Silently reboot? etc)


My informal rule is:

  1. If an interrupt is enabled, then you should have code that handles it.
  2. If you don't write code for an interrupt, disable it.
  3. If you can't disable it, write code for it.

Even without that rule, though, the data sheet explicitly answers your question:

If the user does not intend to take corrective action in the event of a trap error condition, these vectors must be loaded with the address of a default handler that simply contains the RESET instruction. If, on the other hand, one of the vectors containing an invalid address is called, an address error trap is generated.

(Source, section 8.3, first note)

Given that you cannot mask traps, then you must handle them. If you do not desire to deal with the trap in a particular fashion, the appropriate method is to execute a RESET instruction.