Hay un método get(sql)
(no puedo modificarlo). Este método devuelve MyObjects y tiene que estar en el bloque try catch porque JqlParseException
es posible allí. mi código es:
String sql = something; try{ MyObject object = get(sql); } catch(JqlParseException e){ e.printStackTrace(); } catch(RuntimeException e){ e.printStackTrace(); }
Quiero eliminar try catch y usar la clase Optional
, probé:
MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);
pero la fuerza IDE allí intenta atrapar también. Y para:
MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));
es un error (en IDE) The type JqlParseException does not define JqlParseException() that is applicable
. ¿Hay alguna forma de evitar intentar atrapar bloques y usar opcional?
Optional
no tiene el propósito de tratar con excepciones, estaba destinado a tratar con posibles null
sin interrumpir el flujo de su programa. Por ejemplo:
myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");
Esto omitirá automáticamente el paso del map
si el opcional estaba vacío e irá directamente al paso de throw
, un buen flujo de programa ininterrumpido.
Cuando escribes:
myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));
... lo que realmente estás diciendo es: devuelve mi valor opcional, pero lanza una excepción si no está disponible.
Lo que parece querer es una forma de crear un opcional (que captura instantáneamente la excepción) y volverá a lanzar esa excepción cuando intente usar el opcional.
Así no es como funcionan los Opcionales. No hacen que los bloques try-catch sean obsoletos. Sin embargo, podría introducir una nueva función contenedora como esta:
public Optional<MyObject> getMyObject(final String jql) { try { return Optional.ofNullable(get(sql)); } catch (final JqlParseException e) { return Optional.empty(); } }
Ya no tendrá que lidiar con la excepción, pero no sabrá si hubo un error si también obtiene un Opcional vacío.
Prueba esto
Optional.ofNullable(result) .orElseThrow(() -> new GenericClientException("Request body is not valid", HttpStatus.BAD_REQUEST));