Excecoes¶
Namespace: local_middag\framework\exception.
Hierarquia¶
| Classe | Extends | HTTP | Uso |
|---|---|---|---|
middag_exception |
RuntimeException |
500 | Classe abstrata raiz. Catch generico: catch (middag_exception $e) |
middag_domain_exception |
middag_exception |
400 | Regra de negocio violada, invariante quebrado |
middag_validation_exception |
middag_domain_exception |
422 | Input inválido com mapa de erros por campo |
middag_not_found_exception |
middag_domain_exception |
404 | Recurso ou registro não encontrado |
middag_authentication_exception |
middag_exception |
401 | Usuário não identificado — token inválido/expirado, sessão ausente, guest |
middag_authorization_exception |
middag_exception |
403 | Sem capability, API desabilitada, sesskey inválido |
middag_infrastructure_exception |
middag_exception |
500 | Falha de infra (DB, rede, filesystem, serviço externo) |
middag_persistence_exception |
middag_infrastructure_exception |
500 | Falha específica de persistência/storage |
middag_lifecycle_violation_exception |
middag_exception |
500 | Violacao de fase do container (@internal) |
RuntimeException
└── middag_exception (abstract) 500
├── middag_domain_exception 400
│ ├── middag_validation_exception 422
│ └── middag_not_found_exception 404
├── middag_authentication_exception 401
├── middag_authorization_exception 403
├── middag_infrastructure_exception 500
│ └── middag_persistence_exception 500
└── middag_lifecycle_violation_exception 500 @internal
Quem pode lancar o que¶
| Camada | Excecoes permitidas |
|---|---|
domain/ |
middag_domain_exception, middag_validation_exception, middag_not_found_exception |
infrastructure/ |
middag_infrastructure_exception, middag_persistence_exception |
extensions/ |
middag_domain_exception, middag_validation_exception, middag_not_found_exception, middag_authorization_exception |
kernel/ |
middag_lifecycle_violation_exception (exclusivo), middag_authentication_exception e middag_authorization_exception (camada HTTP do kernel) |
Extensions nunca lancam middag_infrastructure_exception ou middag_persistence_exception diretamente. Essas exceções são responsabilidade da camada de infraestrutura.
validation_exception¶
Carrega um mapa estruturado de erros por campo.
Construtor¶
Exemplo¶
throw new middag_validation_exception(
message: 'Dados invalidos',
errors: [
'name' => 'O campo name é obrigatório.',
'email' => 'Formato de email inválido.',
],
);
Acesso aos erros¶
try {
$request->validate();
} catch (middag_validation_exception $e) {
$errors = $e->errors(); // ['field' => 'message', ...]
$code = $e->getStatusCode(); // 422
}
Regra de wrapping¶
Excecoes nativas do PHP ou do Moodle (dml_exception, moodle_exception, \InvalidArgumentException, etc.) devem ser encapsuladas antes de cruzar a fronteira da camada. Use o parametro previous: para preservar o erro original.
try {
$DB->insert_record('middag_items', $record);
} catch (\dml_exception $e) {
throw new middag_persistence_exception(
message: 'Failed to persist item',
previous: $e,
);
}
lifecycle_violation_exception¶
Marcada @internal. Lancada exclusivamente pelo kernel quando código tenta uma operação fora da fase permitida (ex: registrar service apos boot).
Extensions nunca lancam esta exceção. Extensions nunca fazem catch desta exceção — ela indica erro de programacao.
Conversao HTTP¶
Toda exceção middag_exception expoe getStatusCode(): int. O kernel usa esse método para converter exceções em respostas HTTP automaticamente.
Distinção 401 vs 403¶
- 401
middag_authentication_exception— usuário desconhecido: token ausente/inválido/expirado, sem sessão ativa, guest. A identidade não foi estabelecida. - 403
middag_authorization_exception— usuário identificado mas sem permissão: capability ausente, API desabilitada, sesskey inválido.