optimize code and add error msg