ข้อผิดพลาดรันไทม์และการสนับสนุน
รายการเหล่านี้บันทึก exception ที่ยกโดยชั้น runtime support: นโยบายการลดทอน การขนส่ง HTTP ที่ขับเคลื่อนด้วย cURL ตัว resilience circuit breaker ตัวปล่อย Security Information and Event Management (SIEM) render manifest การตรวจสอบ PDF และระบบย่อย chaos-engineering
ทุก exception ของ NextPDF สืบทอดจาก NextPdfException ซึ่งนำ
ContextAwareExceptionInterface ไปใช้และเปิดเผย getContext(): array สำหรับ
การล็อกวินิจฉัยแบบมีโครงสร้าง ซับคลาสเติมอาร์เรย์นั้นเฉพาะเมื่อมัน
เขียนทับ getContext() ฐานคืนอาร์เรย์ว่าง สาม exception บน
หน้านี้ (DegradedException, CircuitBreakerOpenException, และ InspectException) สืบทอดจาก
RuntimeException ของ PHP โดยตรงและเปิดเผยข้อมูลผ่านพร็อพเพอร์ตี public readonly
แทน getContext() แต่ละรายการด้านล่างระบุชื่อ
พร็อพเพอร์ตีหรือคีย์ context ที่แน่นอนที่คลาสพกพา ดึงมาจาก source
นโยบายการลดระดับการทำงาน
หัวข้อที่มีชื่อว่า “นโยบายการลดระดับการทำงาน”DegradedException
หัวข้อที่มีชื่อว่า “DegradedException”- ถูกยกเมื่อใด ไปป์ไลน์การเรนเดอร์พบความสามารถที่ถูกลดทอน
ซึ่งละเมิดนโยบายการลดทอนที่ทำงานอยู่ ภายใต้
DegradationPolicy::Strictการลดทอนผลกระทบสูงใดๆ (ComplianceRisk,SemanticLoss, หรือBlocking) ยกมัน ภายใต้DegradationPolicy::BalancedเฉพาะผลกระทบBlockingเท่านั้นที่ยกมัน - Class สืบทอดจาก
RuntimeExceptionโดยตรง (ไม่ใช่NextPdfException) มัน จึงไม่พกพาgetContext() - Data carried พร็อพเพอร์ตี public
readonlyสองตัว:$capability(value objectCapabilityที่ทำให้เกิดการปฏิเสธ รวมถึงid,status,reason,fallbackTarget, และimpact) และ$policy(DegradationPolicyที่ทำงานอยู่ ณ เวลาปฏิเสธ) ข้อความมีรูปแบบFeature "<id>" is <status>: <reason> (policy: <policy>) - Recovery ตรวจสอบ
$capabilityเพื่อระบุคุณสมบัติที่ขาดหายและ สาเหตุของมัน ติดตั้งส่วนประกอบที่ความสามารถต้องการ ยอมรับ การกำหนดค่าผลกระทบต่ำลง หรือผ่อนนโยบายจากStrictเป็นBalancedเมื่อการลดทอนยอมรับได้สำหรับ use case เรียก$capability->isAvailable()/isDegraded()เพื่อขับการส่งข้อความที่ผู้ใช้เห็น
การขนส่ง HTTP
หัวข้อที่มีชื่อว่า “การขนส่ง HTTP”exception สามตัวนี้มีต้นกำเนิดใน client PSR-18 ที่ขับเคลื่อนด้วย cURL และ
decorator ที่ตระหนักความปลอดภัยของมัน สองตัวแรกสืบทอดจาก NextPdfException แต่ไม่
เขียนทับ getContext() ดังนั้น getContext() ของมันคืนอาร์เรย์ว่าง
ข้อมูลวินิจฉัยเข้าถึงได้ผ่าน accessor getRequest() ของ PSR-18 และ
throwable ก่อนหน้าที่เชื่อมโยงกัน
CurlNetworkException
หัวข้อที่มีชื่อว่า “CurlNetworkException”- ถูกยกเมื่อใด คำขอ HTTP ไม่อาจทำให้สำเร็จได้เนื่องจาก ข้อบกพร่องระดับเครือข่าย: ความล้มเหลวการ resolve Domain Name System (DNS), การ timeout การเชื่อมต่อ หรือข้อผิดพลาด handshake Transport Layer Security (TLS) มัน ยังเป็นคลาสที่ decorator ที่ตระหนักความปลอดภัยยกขึ้นสำหรับการ ปฏิเสธด้านความปลอดภัย (การปฏิเสธ Server-Side Request Forgery การปฏิเสธ DNS-rebinding หรือ redirect ที่ถูกปฏิเสธ)
- Class นำ PSR-18
Psr\Http\Client\NetworkExceptionInterfaceไปใช้ - Data carried
getRequest()คืนRequestInterfaceที่ล้มเหลว ข้อผิดพลาดการขนส่งต้นทาง เมื่อมี เป็น throwable ก่อนหน้าที่เชื่อมโยงกันgetContext()คืนอาร์เรย์ว่าง (ค่าเริ่มต้นฐาน) - Recovery ข้อบกพร่องเครือข่ายอาจชั่วคราว — ลองใหม่ด้วย backoff หาก คำขอเป็น idempotent การปฏิเสธด้านความปลอดภัยไม่ชั่วคราวและต้องล้มเหลว แบบปิด: อย่าลองใหม่ แก้ URL เป้าหมายหรือนโยบาย SSRF แทน อ่านข้อความและ throwable ก่อนหน้าเพื่อแยกทั้งสอง
CurlRequestException
หัวข้อที่มีชื่อว่า “CurlRequestException”- ถูกยกเมื่อใด คำขอเองไม่อาจถูกส่งได้เพราะมันผิดรูป ตัวอย่างเช่น URL ที่ไม่ถูกต้องหรือคำขอที่ล้มเหลวการตรวจสอบยืนยัน SSRF ก่อน การเรียกเครือข่ายใดๆ
- Class นำ PSR-18
Psr\Http\Client\RequestExceptionInterfaceไปใช้ - Data carried
getRequest()คืนRequestInterfaceที่เป็นปัญหา สาเหตุพื้นฐาน เมื่อมี เป็น throwable ก่อนหน้าที่เชื่อมโยงกันgetContext()คืนอาร์เรย์ว่าง - Recovery นี่เป็นข้อบกพร่องของ input ผู้เรียกหรือนโยบาย ไม่ใช่ข้อบกพร่อง ชั่วคราว อย่าลองใหม่โดยไม่เปลี่ยน แก้ URL คำขอ header หรือ body หรือ ปรับ allowlist ของ SSRF หากเป้าหมายได้รับอนุญาตโดยชอบ แล้ว ส่งคำขอใหม่
TransientHttpException
หัวข้อที่มีชื่อว่า “TransientHttpException”- ถูกยกเมื่อใด ภายใน
SecurityAwareHttpClientเพื่อทำเครื่องหมาย ข้อบกพร่อง inner-transport ที่ชั่วคราวอย่างแท้จริง (DNS การเชื่อมต่อ หรือ timeout ที่ยกโดย client PSR-18 ภายใน) ว่ามีสิทธิ์สำหรับงบประมาณการลองใหม่ที่มีขอบเขต มันเป็นคลาสเดียวที่มีสิทธิ์ลองใหม่ที่ลูปการลองใหม่ของ decorator รู้จัก exception ที่ไม่ถูก wrap (การปฏิเสธด้านความปลอดภัยที่ decorator ยก) ถูก ถือว่าเป็นภัยร้ายแรง - Class นำ PSR-18
Psr\Http\Client\NetworkExceptionInterfaceไปใช้ ทำเครื่องหมาย@internal— มันถูกสร้างและ unwrap ทั้งหมดภายในSecurityAwareHttpClientและไม่เคยหลุดออกจาก decorator - Data carried
getRequest()คืนคำขอที่ล้มเหลวClientExceptionInterfaceของ inner-transport ดั้งเดิมถูกรักษาไว้เป็น throwable ก่อนหน้าที่เชื่อมโยงกัน (getPrevious()) และถูกปรากฏใหม่ตามตัวอักษรไปยังผู้เรียก เมื่องบประมาณการลองใหม่หมดลง สัญญา PSR-18 สาธารณะจึง ไม่เปลี่ยนแปลงgetContext()คืนอาร์เรย์ว่าง - Recovery โค้ดแอปพลิเคชันไม่จับชนิดนี้โดยตรง จับ exception ภายในที่ปรากฏใหม่ที่ decorator คืนหลังจากงบประมาณการลองใหม่ ถูกใช้ และถือว่าความล้มเหลวชั่วคราวที่เกิดซ้ำเป็นปัญหาความพร้อมใช้งานต้นน้ำ
ความยืดหยุ่น
หัวข้อที่มีชื่อว่า “ความยืดหยุ่น”CircuitBreakerOpenException
หัวข้อที่มีชื่อว่า “CircuitBreakerOpenException”- ถูกยกเมื่อใด
CircuitBreakerในสถานะCircuitBreakerState::Openปฏิเสธการเรียกแบบ fail-fast ก่อนการเรียกใช้ปลายน้ำใดๆ มันมีอยู่เพื่อให้ ผู้เรียกแยก “บริการระยะไกลเข้าถึงไม่ได้ตอนนี้” ( ข้อบกพร่องการขนส่งชั่วคราว ควรลดทอน) ออกจาก “connection pool จะ ถูกใช้จนหมดโดยการเรียกนี้” (fail-fast ไม่มีการพยายามเครือข่าย) — การ มิติเกชัน batch denial-of-service ที่จำเป็นสำหรับ client Public Key Infrastructure (PKI) - Class สืบทอดจาก
RuntimeExceptionโดยตรง มันจึงไม่พกพาgetContext() - Data carried พร็อพเพอร์ตี public
readonlyสองตัว:$breakerName( ตัวระบุของ breaker ที่เปิด) และ$secondsUntilHalfOpen( ระยะ cooldown โดยประมาณที่เหลือก่อน breaker เปลี่ยนเป็น half-open) ข้อความ มีรูปแบบCircuit breaker "<name>" is OPEN (cooldown ~<n>s remaining); call rejected fail-fast. - Recovery อย่ากระหน่ำ breaker — รออย่างน้อย
$secondsUntilHalfOpenก่อนลองใหม่ หรือลดทอน operation ไม่มีการ เรียกเครือข่ายเกิดขึ้น นี่จึงไม่ใช่หลักฐานว่าบริการระยะไกล เองล้มเหลว มันเป็น back-pressure ที่ปกป้อง connection pool
การสังเกตการณ์
หัวข้อที่มีชื่อว่า “การสังเกตการณ์”SiemEmitterException
หัวข้อที่มีชื่อว่า “SiemEmitterException”- ถูกยกเมื่อใด ตัวปล่อยเหตุการณ์ SIEM ไม่อาจ persist หรือ chain record มัน
ปรากฏความล้มเหลวระดับ filesystem (
open,lock,seek,write,fflush,read) และข้อบกพร่องความครบถ้วน hash-chain (chain: ดัชนี นอกลำดับ record tail ที่ผิดรูป หรือ JSON round-trip drift) ที่ใช้ร่วมกันทั่ว hash-chain event log และ adapter ตัวปล่อยไฟล์ JSON-lines - Class สืบทอดจาก
NextPdfExceptionและเขียนทับgetContext() - Context keys
operation(หนึ่งในopen,lock,seek,write,fflush,read,chain),path(path ของ log เป้าหมาย) และdetail( รายละเอียดที่มนุษย์อ่านได้ เช่น จำนวนไบต์หรือดัชนีที่คาดหวังเทียบกับจริง) สิ่งเหล่านี้ยังเข้าถึงได้ผ่านgetOperation(),getPath(), และgetDetail()ข้อความมีรูปแบบSIEM emitter <operation> failed for <path>: <detail>. - Recovery นี่ทำตามได้โดยฝ่ายโครงสร้างพื้นฐานหรือ SecOps ไม่ใช่โดย
ลอจิกแอปพลิเคชัน ตรวจสอบ mount ของ log-volume สิทธิ์ของไดเรกทอรี
file descriptor ที่ใช้ได้ และสุขภาพ filesystem ความล้มเหลว operation
chainบ่งชี้สัญญาณ tamper หรือ corruption ใน audit log และควร ถูกตรวจสอบ ไม่ใช่ลองใหม่อย่างเงียบๆ
manifest การเรนเดอร์
หัวข้อที่มีชื่อว่า “manifest การเรนเดอร์”RenderManifestException
หัวข้อที่มีชื่อว่า “RenderManifestException”- ถูกยกเมื่อใด
RenderManifestไม่อาจถูกสร้าง deserialize หรือ อ่านได้เนื่องจากข้อผิดพลาดเชิงโครงสร้าง ชนิด หรือความเข้ากันได้ของ schema manifest เป็นสัญญาสาธารณะแบบมีเวอร์ชันที่ส่งโดยทุก transport (CLI, Laravel queue, Symfony, SaaS API) manifest ที่ผิดรูปหรือไม่เข้ากันจึง ถูกปรากฏโดยตรงแทนการบีบให้เป็นค่าเริ่มต้น - Class สืบทอดจาก
NextPdfExceptionและเขียนทับgetContext()constructor ที่ระบุชื่อตั้งรหัสที่เครื่องอ่านได้และเสถียรใน namespaceSPEC-MANIFEST-*:RenderManifestException::shape()→SPEC-MANIFEST-001— ข้อผิดพลาดรูปทรงหรือ ชนิดระหว่างRenderManifest::fromArray()RenderManifestException::incompatibleVersion()→SPEC-MANIFEST-002— เวอร์ชัน major ของ schema ที่ไม่เข้ากัน (อ่านไม่ได้)RenderManifestException::missingField()→SPEC-MANIFEST-003— ฟิลด์ ที่จำเป็นขาดหายระหว่างการ finalize builderRenderManifestException::unsupported()→SPEC-MANIFEST-004— manifest ที่มีรูปแบบดีอ้างถึง input หรือ template ที่ตัวเรนเดอร์ปัจจุบัน ไม่อาจ resolve ได้ (ตัวอย่างเช่น URI input หรือ template engine แบบ host-only)
- Context keys
manifest_code(ตัวระบุSPEC-MANIFEST-*) และreason(คำอธิบายความล้มเหลวที่มนุษย์อ่านได้) สิ่งเหล่านี้ยังเข้าถึงได้ผ่านgetManifestCode()และgetReason()ข้อความมีรูปแบบ[<code>] <reason> - Recovery แยกกิ่งบน
manifest_codeสำหรับSPEC-MANIFEST-001และSPEC-MANIFEST-003ให้แก้ payload ของ manifest (แก้ชนิดฟิลด์หรือ จัดหาฟิลด์ที่ขาดหาย) สำหรับSPEC-MANIFEST-002ให้สร้าง manifest ใหม่ เทียบกับเวอร์ชัน major ของ schema ที่รองรับหรืออัปเกรดตัวเรนเดอร์ สำหรับSPEC-MANIFEST-004ให้จัดหา input หรือ template engine ที่ edition ปัจจุบัน resolve ได้
การตรวจสอบ
หัวข้อที่มีชื่อว่า “การตรวจสอบ”InspectException
หัวข้อที่มีชื่อว่า “InspectException”- ถูกยกเมื่อใด การตรวจสอบ PDF ล้มเหลว
- Class สืบทอดจาก
RuntimeExceptionโดยตรง (ไม่ใช่NextPdfException) มัน จึงไม่พกพาgetContext() - Data carried พร็อพเพอร์ตี public
readonlyสองตัว:$inspectCode( รหัสที่เครื่องอ่านได้ใน namespaceINSPECT-*) และ$retryable( boolean ที่บ่งชี้ว่าผู้เรียกควรลองใหม่หรือไม่ — ตัวอย่างเช่นเมื่อ inspection sidecar ล่มชั่วคราว) สาเหตุต้นทาง เมื่อ มี เป็น throwable ก่อนหน้าที่เชื่อมโยงกัน - Recovery แยกกิ่งบน
$inspectCodeสำหรับคลาสความล้มเหลวที่เฉพาะเจาะจง เมื่อ$retryableเป็นtrueให้ลองใหม่ด้วย backoff เพราะคาดว่าความล้มเหลว จะชั่วคราว (เช่นการ restart sidecar) เมื่อfalseให้ถือว่า input หรือการกำหนดค่าเป็นข้อบกพร่องและอย่าลองใหม่โดยไม่เปลี่ยน
วิศวกรรมความโกลาหล
หัวข้อที่มีชื่อว่า “วิศวกรรมความโกลาหล”ChaosReportWriteException
หัวข้อที่มีชื่อว่า “ChaosReportWriteException”- ถูกยกเมื่อใด
ChaosScenarioRunner::writeReport()ไม่อาจ persist รายงาน chaos-day ที่รวมแล้วลงดิสก์ มันเป็นการแทนที่แบบมีชนิดโดเมนสำหรับ runtime error ทั่วไป ผู้เรียกจึงจับความล้มเหลว report-disk ที่เฉพาะเจาะจง ได้โดยไม่รวมมันกับข้อผิดพลาดที่ยกภายในตัวจำลอง scenario เอง (runner จับพวกนั้นเป็นฟิลด์ChaosOutcome) - Class สืบทอดจาก
NextPdfExceptionและเขียนทับgetContext() - Context keys
output_path(absolute path ที่ runner พยายาม เขียน) มันยังเข้าถึงได้ผ่านgetOutputPath()ข้อความมี รูปแบบChaosScenarioRunner: failed to write report to "<path>". - Recovery นี่เป็นความล้มเหลวฝั่งเขียนของ report sink ไม่ใช่ของ scenario ตรวจสอบว่าไดเรกทอรีเอาต์พุตมีอยู่และเขียนได้และว่าพื้นที่ดิสก์ ใช้ได้ แล้วรันการเขียนรายงานใหม่ ผล chaos เองไม่ได้รับผลกระทบ
RetrievalUnavailableException
หัวข้อที่มีชื่อว่า “RetrievalUnavailableException”- ถูกยกเมื่อใด ปลายทางการดึงข้อมูล (ตัวอย่างเช่นบริการ Voyage Retrieval Augmented Generation) ไม่พร้อมใช้งานและระบบ fall back ไปยังโหมด cached-only หรือล้มเหลวแบบปิด
- Class สืบทอดจาก
NextPdfExceptionและเขียนทับgetContext() - Context keys
mode(โหมดการทำงานหลังความล้มเหลว —CACHED_ONLYเมื่อผลลัพธ์ถูกเสิร์ฟจาก semantic cache เท่านั้น หรือFAIL_CLOSEDเมื่อคำขอถูกปฏิเสธทั้งหมดโดยไม่มีข้อมูลค้าง) และendpoint(ปลายทางที่กลายเป็นเข้าถึงไม่ได้) สิ่งเหล่านี้ยังเข้าถึงได้ ผ่านgetMode()และgetEndpoint()ข้อความมีรูปแบบRetrieval endpoint "<endpoint>" is unavailable; operating in <mode> mode. - Recovery อ่าน
modeเพื่อเรียนรู้ว่าระบบลดทอนอย่างไร ภายใต้CACHED_ONLYผลลัพธ์อาจค้าง รีเฟรชเมื่อปลายทางกู้คืน ภายใต้FAIL_CLOSEDคำขอถูกปฏิเสธโดยการออกแบบและต้องลองใหม่ หลังจากปลายทางเข้าถึงได้ กู้คืนการเชื่อมต่อปลายทาง (เครือข่าย credential สุขภาพบริการ) ก่อนพึ่งพาการดึงข้อมูลใหม่