throw y propagación
Además de capturar excepciones, puedes lanzarlas tú con throw cuando un dato no cuadra. Y si el método que la lanza no la captura, la excepción sube hasta quien sí pueda hacer algo con ella.
✓ En esta sub-lección
- 01Lanzar una excepción con throw new cuando un dato no cumple una regla.
- 02Explicar cómo sube una excepción de método en método hasta un catch o hasta la plataforma.
- 03Decidir dónde capturar: en el sitio que sabe qué hacer con el fallo.
La nutria: ¿Te acuerdas? · Repaso de la lección 2
Account a = [SELECT Id FROM Account WHERE ERP_Code__c = 'ERP-404']; y ese código no existe. ¿Qué excepción salta?
Hasta ahora las excepciones las lanzaba Apex: un texto que no era un número, una consulta sin filas. Pero hay datos que Apex acepta sin rechistar y que tu negocio no: un importe vacío o negativo es un Decimal perfectamente válido para Apex, y un disparate para una renovación. Para esos casos, la excepción la lanzas tú.
throw: lanzar tú la excepción
throw new, seguido del tipo de excepción y un mensaje, para el método en seco en esa línea, igual que lo haría un fallo de Apex. Para errores del tipo «el dato que me has dado no es válido», Apex trae IllegalArgumentException, que puedes lanzar tú. En la lección 4 crearás las tuyas, con el nombre de tu negocio.
public static Decimal parseAmount(String raw) {
if (String.isBlank(raw)) {
throw new IllegalArgumentException('Importe vacío'); // el método se para aquí
}
Decimal amount = Decimal.valueOf(raw);
if (amount <= 0) {
throw new IllegalArgumentException('Importe no positivo: ' + raw);
}
return amount; // solo llega si todo cuadra
}La nutria: Como tu regla de validación, pero en un método
Propagación: la excepción sube hasta que alguien la atrapa
Cuando parseAmount lanza, no hace falta que la capture ella. La excepción hace un viaje hacia arriba (se llama ): sale del método que la lanzó y aparece en la línea que lo llamó. Si esa línea está dentro de un try con un catch del tipo adecuado, ahí se atrapa. Si no, sigue subiendo al método de más arriba, y así hasta llegar a la plataforma, que para la transacción. Por eso parseAmount puede ser pequeño y honesto: valida, lanza si algo no cuadra, y deja la decisión a quien lo llama.
LA PILA DE LLAMADAS · ARRIBA, QUIEN LLAMA
- Plataforma (la transacción)
- for (String raw : rawAmounts) { … }
- RenewalRow.parseAmount(raw)throw new IllegalArgumentException(…)
Paso 1 de 4
parseAmount recibe '' y lanza. Elige dónde está el catch y pulsa Reproducir.
for (String raw : rawAmounts) {
try {
Decimal amount = RenewalRow.parseAmount(raw); // puede lanzar: la excepción sube hasta aquí
imported++; // solo si parseAmount no lanzó nada
} catch (IllegalArgumentException e) {
rejected++;
System.debug('Rechazado: ' + e.getMessage());
}
}La nutria: ¿Y por qué no un Flow? Porque un subflow no sabe «lanzar»