It is not just T/nil it is (T or any value) / nil.

It is just the 'and' and 'or' expressions recognize nil as no and anything else as yes.

The error trap returns T or a value for success and nil for failure.

Error message can also displayed using this variation of the error trap function

Code:
(defun ErrorTrap (symFunction / objError result)
 (if (vl-catch-all-error-p
      (setq objError (vl-catch-all-apply
                     '(lambda (XYZ)(set XYZ (eval symFunction)))
                      (list 'result))))
  (and
   DEBUG
   (princ 
    (strcat "\nError: " 
            (vl-catch-all-error-message objError)
            ". While evaluating the expression: "
            (vl-princ-to-string symfunction) "\n"
    )
   )
   nil  
  )
  (or result 
      'T
  )
 )
)
Example of code

Code:
Command: (setq DEBUG 1)
Command: (errortrap '(/ 1 0))

Error: divide by zero. While evaluating the expression: (/ 1 0)
nil