ข้อยกเว้นที่คุณเห็นเกิดจากความปลอดภัยของสคริปต์และแซนด์บ็อกซ์ โดยพื้นฐานแล้วโดยค่าเริ่มต้นเมื่อคุณรันสคริปต์ไปป์ไลน์จะทำงานในแซนด์บ็อกซ์ซึ่งอนุญาตให้ใช้เฉพาะเมธอดและคลาสบางอย่างเท่านั้น มีหลายวิธีในการดำเนินการที่อนุญาตพิเศษตรวจสอบลิงก์ด้านบน
@NonCPS
คำอธิบายประกอบเป็นประโยชน์เมื่อคุณมีวิธีการที่ใช้วัตถุที่ไม่ serializable โดยปกติออบเจ็กต์ทั้งหมดที่คุณสร้างในสคริปต์ไปป์ไลน์ของคุณจะต้องสามารถต่ออนุกรมกันได้ (เหตุผลก็คือเจนกินส์ต้องสามารถทำให้สถานะของสคริปต์เป็นอนุกรมเพื่อให้สามารถหยุดชั่วคราวและเก็บไว้ในดิสก์ได้)
เมื่อคุณ@NonCPS
ใช้วิธีการ Jenkins จะดำเนินการวิธีการทั้งหมดในครั้งเดียวโดยไม่สามารถหยุดชั่วคราวได้ นอกจากนี้คุณไม่ได้รับอนุญาตให้อ้างอิงขั้นตอนไปป์ไลน์หรือวิธีการแปลง CPS จากภายใน@NonCPS
วิธีการที่มีคำอธิบายประกอบ ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้สามารถพบได้ที่นี่
สำหรับการจัดการข้อยกเว้น: ไม่แน่ใจ 100% ว่าคุณกำลังประสบกับอะไร ฉันได้ลองทำสิ่งต่อไปนี้แล้วและได้ผลตามที่คาดไว้:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
และ
@NonCPS
def myFunction() {
throw new RuntimeException();
}
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
และในที่สุดก็:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
@NonCPS
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
พิมพ์ "Caught" ทั้งหมดตามที่คาดไว้