How to catch mail() error?

The return value from $mail refers only to whether or not your server’s mailing system accepted the message for delivery, and does not and can not in any way know whether or not you are providing valid arguments. For example, the return value would be false if sendmail failed to load (e.g. if it wasn’t installed properly), but would return true if sendmail loaded properly but the recipient address doesn’t exist.