Bu sayfa Cluster ERP'nin hata sınıflarını ve kodlarını ve sunucunun istisnaları HTTP yanıtlarına nasıl çevirdiğini listeler. core/errors.py, core/exceptions.py ve server/error_handler.py dosyalarını kapsar. Kodların istemcinin gördüğü biçimde nedenleriyle tam listesi API hataları sayfasındadır.
Kapsam ve kaynak¶
- Tanımlandığı yer:
src/cluster_erp/core/errors.py(AppError, kod sabitleri, fabrikalar),src/cluster_erp/core/exceptions.py(platform istisnaları),src/cluster_erp/server/error_handler.py(install_error_handlers) - Sayı:
core/errors.pyiçindeNAME = "NAME"biçiminde 213 modül düzeyi dizgi sabiti (grep -c -E '^[A-Z_0-9]+ = "'ile sayıldı), 23 yorumlu grupta; 6 fabrika işlevi;core/exceptions.pyiçinde 7 istisna sınıfı (grep -c "^class"ile sayıldı)
Hata gövdesi¶
Ele alınan her hata _build_body ile kurulan bir JSON gövdesi döndürür (src/cluster_erp/server/error_handler.py:33-46):
{
"error": {
"code": "<CODE>",
"message": "<developer message>",
"trace_id": "<YYMMDD-NNN>",
"details": {}
}
}
details yalnızca boş değilse bulunur. Hata ayıklama kipinde ele alınmayan istisna işleyicisi debug_message ve exception_type ekler, eşlenmiş işleyiciler debug_message ekler (src/cluster_erp/server/error_handler.py:305-308, src/cluster_erp/server/error_handler.py:345-347). debug_message en fazla sürücü mesajının ilk satırını, 300 karaktere kısaltılmış olarak taşır; SQL metnini asla taşımaz (src/cluster_erp/server/error_handler.py:99-107).
İzleme kimlikleri¶
_next_trace_id, trace_sequence tablosunda günlük bir sayacı artırır ve YYMMDD-NNN döndürür. Veritabanına ulaşılamazsa monoton bir saatten alınan sekiz basamakla YYMMDD- döndürür (src/cluster_erp/server/error_handler.py:49-70). Tablo feefe25508db_add_trace_sequence_table.py göçünden gelir. İşleyiciler izleme kimliğini ve hata verisini request.state üzerinde saklar; etkinlik günlüğü ara katmanı bunları hata günlüğüne yazar (src/cluster_erp/server/error_handler.py:73-93, src/cluster_erp/server/middleware.py:638-659).
AppError¶
AppError(code, message, *, status_code=400, details=None), servislerin ve rotaların yükselttiği istisnadır (src/cluster_erp/core/errors.py:6-30). Kod makine tarafından okunur, istemci onu yerelleştirilmiş bir metne eşler; mesaj İngilizce bir geliştirici dizgisidir (src/cluster_erp/core/errors.py:7-16).
Kod grupları¶
| Grup yorumu | Kod sayısı | Satırlar | Örnekler |
|---|---|---|---|
| Auth | 12 | src/cluster_erp/core/errors.py:33-48 |
AUTH_TOKEN_EXPIRED, AUTH_PERMISSION_DENIED |
| Resource CRUD | 3 | src/cluster_erp/core/errors.py:50-53 |
RESOURCE_NOT_FOUND, RESOURCE_CONFLICT, RESOURCE_PROTECTED |
| Validation | 7 | src/cluster_erp/core/errors.py:55-75 |
VALIDATION_ERROR, FIELD_VALUE_INVALID |
| Business logic | 5 | src/cluster_erp/core/errors.py:77-82 |
UNIT_CONVERSION_FAILED, APPROVAL_INVALID_STATE |
| Currency | 1 | src/cluster_erp/core/errors.py:84-85 |
TCMB_SYNC_FAILED |
| CRM | 14 | src/cluster_erp/core/errors.py:87-104 |
RFQ_INVALID_STATUS, PRFQ_AWARD_INVALID |
| Quotations | 9 | src/cluster_erp/core/errors.py:106-117 |
QUOTE_INVALID_STATUS, QUOTE_INCOMPLETE |
| Sales Orders | 9 | src/cluster_erp/core/errors.py:119-129 |
ORDER_INVALID_STATUS, PDF_RENDERER_UNAVAILABLE |
| Projects | 8 | src/cluster_erp/core/errors.py:131-139 |
PROJECT_INVALID_STATUS, PROJECT_ACTIVITY_CYCLE |
| BOM | 8 | src/cluster_erp/core/errors.py:141-151 |
BOM_INVALID_STATUS, BOM_MAX_DEPTH_EXCEEDED |
| Design and Engineering | 6 | src/cluster_erp/core/errors.py:153-159 |
DESIGN_INVALID_STATUS, ECN_INVALID_STATUS |
| Products and Materials | 13 | src/cluster_erp/core/errors.py:161-179 |
PRODUCT_NOT_SELLABLE, PRODUCT_VERSION_MODEL_MISMATCH |
| Inventory | 21 | src/cluster_erp/core/errors.py:181-202 |
INVENTORY_INSUFFICIENT_STOCK, INVENTORY_NEGATIVE_STOCK |
| Production | 32 | src/cluster_erp/core/errors.py:204-264 |
dosyaya bakın |
| Nesting | 14 | src/cluster_erp/core/errors.py:266-280 |
dosyaya bakın |
| Costing | 17 | src/cluster_erp/core/errors.py:282-299 |
dosyaya bakın |
| Procurement | 20 | src/cluster_erp/core/errors.py:301-321 |
SUBSTITUTION_GROUP_SINGLE_MEMBER, CRITICAL_MATERIAL_ALREADY_EXISTS |
| Concurrency | 1 | src/cluster_erp/core/errors.py:323-324 |
CONCURRENCY_VERSION_CONFLICT |
| External services | 3 | src/cluster_erp/core/errors.py:326-329 |
SMTP_NOT_CONFIGURED, SMTP_ERROR, FILE_NOT_FOUND_ON_DISK |
| Database | 5 | src/cluster_erp/core/errors.py:331-340 |
DB_INTEGRITY_ERROR, DB_UNIQUE_VIOLATION |
| Serialization | 1 | src/cluster_erp/core/errors.py:342-343 |
SERIALIZATION_ERROR |
| Runtime | 3 | src/cluster_erp/core/errors.py:345-348 |
TYPE_ERROR, VALUE_ERROR, TIMEOUT_ERROR |
| Server | 1 | src/cluster_erp/core/errors.py:350-351 |
INTERNAL_ERROR |
Bazı modüller kendi dosyalarında ek kodlar tanımlar; örneğin CURRENCY_UNKNOWN (src/cluster_erp/core/currencies.py:27) ve UPLOAD_TYPE_REFUSED (src/cluster_erp/core/upload_policy.py:19). Bunlar yukarıda sayılmamıştır.
Fabrikalar¶
| İşlev | Kod | HTTP durumu | Kaynak |
|---|---|---|---|
not_found(resource, resource_id=None) |
RESOURCE_NOT_FOUND |
404 | src/cluster_erp/core/errors.py:357-367 |
conflict(resource, field, value) |
RESOURCE_CONFLICT |
409 | src/cluster_erp/core/errors.py:370-376 |
protected(resource, reason="") |
RESOURCE_PROTECTED |
400 | src/cluster_erp/core/errors.py:379-385 |
permission_denied(permission) |
AUTH_PERMISSION_DENIED |
403 | src/cluster_erp/core/errors.py:388-394 |
privilege_escalation(missing_codes) |
AUTH_PRIVILEGE_ESCALATION |
403 | src/cluster_erp/core/errors.py:397-408 |
version_conflict(resource, expected, actual) ve check_version(...) |
CONCURRENCY_VERSION_CONFLICT |
409 | src/cluster_erp/core/errors.py:411-430 |
İstisna işleyicileri¶
install_error_handlers(app, debug) aşağıdaki işleyicileri kaydeder (src/cluster_erp/server/error_handler.py:200-398).
| İstisna | Kod | HTTP durumu | Kaynak |
|---|---|---|---|
AppError |
hatanın kendi kodu | hatanın kendi durumu | src/cluster_erp/server/error_handler.py:203-224 |
RequestValidationError |
VALIDATION_ERROR; details.fields içinde field ve reason listelenir |
422 | src/cluster_erp/server/error_handler.py:226-246 |
HTTPException |
HTTP_<status> ya da sözlük ayrıntısındaki code |
istisnanın durumu | src/cluster_erp/server/error_handler.py:248-270 |
SQLAlchemy DisconnectionError |
DB_CONNECTION_ERROR |
503 | src/cluster_erp/server/error_handler.py:128 |
SQLAlchemy TimeoutError (havuz) |
DB_TIMEOUT |
503 | src/cluster_erp/server/error_handler.py:129-131 |
SQLAlchemy IntegrityError |
bir benzersizlik kısıtı adlandırılmışsa details.constraint ile DB_UNIQUE_VIOLATION, değilse DB_INTEGRITY_ERROR |
409 | src/cluster_erp/server/error_handler.py:132, src/cluster_erp/server/error_handler.py:352-398 |
SQLAlchemy DataError |
VALIDATION_ERROR |
422 | src/cluster_erp/server/error_handler.py:133-135 |
SQLAlchemy OperationalError |
DB_OPERATIONAL_ERROR |
500 | src/cluster_erp/server/error_handler.py:136 |
decimal.InvalidOperation |
VALIDATION_ERROR |
422 | src/cluster_erp/server/error_handler.py:142-148 |
Pydantic ValidationError |
SERIALIZATION_ERROR |
500 | src/cluster_erp/server/error_handler.py:150-155 |
TimeoutError |
TIMEOUT_ERROR |
504 | src/cluster_erp/server/error_handler.py:161 |
TypeError |
TYPE_ERROR |
500 | src/cluster_erp/server/error_handler.py:162 |
ValueError |
VALUE_ERROR |
500 | src/cluster_erp/server/error_handler.py:163 |
diğer her Exception |
INTERNAL_ERROR |
500 | src/cluster_erp/server/error_handler.py:272-310 |
Ele alınmayan istisna işleyicisinin 503 yanıtı Retry-After: 2 başlığını taşır (src/cluster_erp/server/error_handler.py:309). Her eşlenmiş tür kendi işleyicisini alır; böylece onu sunucu hatası ara katmanı yerine Starlette'in istisna ara katmanı ele alır (src/cluster_erp/server/error_handler.py:312-318, src/cluster_erp/server/error_handler.py:394-398).
Platform istisnaları¶
core/exceptions.py içindeki bu sınıfları modül kaydı ve EventBus yükseltir. HTTP kodlarına eşlenmezler.
| Sınıf | Üst sınıf | Ne zaman yükselir | Kaynak |
|---|---|---|---|
ClusterERPError |
Exception |
Temel sınıf | src/cluster_erp/core/exceptions.py:4-5 |
ModuleError |
ClusterERPError |
Modül hataları için temel sınıf | src/cluster_erp/core/exceptions.py:8-9 |
ModuleLoadError |
ModuleError |
Bir modül içe aktarılamadığında veya Module sınıfı olmadığında |
src/cluster_erp/core/exceptions.py:12-16 |
ModuleNotRegisteredError |
ModuleError |
registry.get bilinmeyen bir ad aldığında |
src/cluster_erp/core/exceptions.py:19-22 |
EventBusError |
ClusterERPError |
Veri yolu hataları için temel sınıf | src/cluster_erp/core/exceptions.py:25-26 |
QueryHandlerNotFoundError |
EventBusError |
Bir sorgunun işleyicisi olmadığında | src/cluster_erp/core/exceptions.py:29-32 |
DuplicateQueryHandlerError |
EventBusError |
Bir sorgu türü için ikinci işleyici kaydedildiğinde | src/cluster_erp/core/exceptions.py:35-38 |
Kısıtlar ve doğrulama¶
max_request_body_bytesdeğerinden büyük bir istek gövdesi, herhangi bir işleyici çalışmadan önce bir ara katman tarafından HTTP 413 veREQUEST_TOO_LARGEkoduyla reddedilir (src/cluster_erp/server/app.py:1396-1410). Bu kodcore/errors.pyiçindeki sabitlerden biri değildir.RESOURCE_PROTECTEDhatası 403 değil, HTTP 400 kullanır (src/cluster_erp/core/errors.py:379-385).
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| application error | AppError |
Makine tarafından okunan bir kod, mesaj, durum ve ayrıntı taşıyan istisna. | uygulama hatası | src/cluster_erp/core/errors.py:6 |
| trace id | trace_id |
Bir hata yanıtını hata günlüğü satırına bağlayan günlük sıra kimliği. | izleme kimliği | src/cluster_erp/server/error_handler.py:58-70 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.