My workaround works by calling an undefined function with a meaningful name for an error.
For example:
DROP TRIGGER IF EXISTS users_before_insert;
DROP TRIGGER IF EXISTS users_before_update;
DROP PROCEDURE IF EXISTS validate_password;
delimiter $$
CREATE PROCEDURE validate_password (IN passwd VARCHAR(64))
BEGIN
IF LENGTH(passwd) < 5 THEN
CALL TRIGGER_DUMMY_INVALID_PASSWORD;
END IF;
END$$
CREATE TRIGGER users_before_insert BEFORE INSERT ON users
FOR EACH ROW
BEGIN
CALL validate_password(NEW.password_cleartext);
END$$
CREATE TRIGGER users_before_update BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
CALL validate_password(NEW.password_cleartext);
END$$
delimiter ;
Most of the code in the specific example above was actually written by my colleague Per Fuglsang Møller.