Buenas intentaré ayudarte un poco.
Deberías utilizar el atributo valueChangeListener de p:selectOneMenu, sobre todo en el desplegable de ciudades, así cuando cambie el valor, podras recoger la ciudad escogida por el usuario, y buscar las zonas correspondientes a la ciudad.
En el método del ValueChangeListener deberás realizar la llamada a BBDD para buscar las zonas correspondientes (consultarZonas()).
No captures Throwable, estarías capturando no solo Exception, sino Error, algo que no es recomendable.
Extraído de la documetnación de oracle:
Código Java:
Ver originalAn
Error is a subclass of
Throwable that indicates serious problems that a reasonable application should not
try to
catch.
Most such errors are abnormal conditions.
The ThreadDeath error, though a
"normal" condition, is also a subclass of
Error because most applications should not
try to
catch it.
Evita en la medida de lo posible los System.out y los printStackTrace, son demasiado lentos, en su lugar utiliza log4j para mostrar errores en tu servidor de aplicaciones utilizando los niveles para informar de un warning(WARN), de un error (ERROR), de una traza informativa (INFO)...etc
Saludos.