ในระหว่างการรันโปรแกรมจะพบข้อผิดพลาดต่างๆ อยู่เสมอ เช่น การเปิดไฟล์ที่ไม่มีอยู่
หากเกิดข้อผิดพลาดระหว่างการทำงานของโปรแกรมก็จะหยุดลง เราจำเป็นต้องใช้วิธีการตรวจจับบางอย่างเพื่อหลีกเลี่ยงข้อผิดพลาดและป้องกันไม่ให้โปรแกรมออก
Perl มีหลายวิธีในการจัดการกับข้อผิดพลาด และเราจะแนะนำวิธีเหล่านี้ทีละวิธีในครั้งต่อไป
คำสั่ง if สามารถกำหนดค่าตอบแทนของคำสั่งได้ ตัวอย่างมีดังนี้:
if(open(DATA, $file)){ ...}else{ die "ข้อผิดพลาด: ไม่สามารถเปิดไฟล์ - $!";}
ตัวแปร $! ในโปรแกรมส่งคืนข้อความแสดงข้อผิดพลาด นอกจากนี้เรายังสามารถลดความซับซ้อนของโค้ดข้างต้นเป็นโค้ดต่อไปนี้:
open(DATA, $file) ||. die "ข้อผิดพลาด: ไม่สามารถเปิดไฟล์ - $!";
ฟังก์ชัน เว้นแต่ จะตรงกันข้ามกับ if และ จะถูกดำเนินการเฉพาะเมื่อนิพจน์คืนค่าเท็จ ดังที่แสดงด้านล่าง:
เว้นแต่(chdir("/etc")){ die "ข้อผิดพลาด: ไม่สามารถเปิดไดเร็กทอรี - $!";}
คำสั่ง ยกเว้น มีประโยชน์มากเมื่อคุณต้องการตั้งค่าการแจ้งเตือนข้อผิดพลาด นอกจากนี้เรายังสามารถย่อโค้ดข้างต้นเป็น:
die "ข้อผิดพลาด: ไม่สามารถเปิดไดเร็กทอรี!: $!" เว้นแต่ (chdir("/etc"));
ข้อความแสดงข้อผิดพลาดข้างต้นจะแสดงออกมาเมื่อมีข้อผิดพลาดในการสลับไดเร็กทอรีเท่านั้น
ต่อไปนี้เป็นตัวอย่างง่ายๆ ของตัวดำเนินการที่ประกอบไปด้วย:
print(exists($hash{value}) ? 'มีอยู่' : 'ไม่มีอยู่',"n");
ในตัวอย่างข้างต้น เราใช้ตัวดำเนินการแบบไตรภาคเพื่อพิจารณาว่ามีค่าแฮชอยู่หรือไม่
ตัวอย่างประกอบด้วยนิพจน์ที่มีค่าสองค่า ในรูปแบบ: expression? value one: value two
ฟังก์ชันคำเตือนใช้เพื่อทริกเกอร์ข้อความเตือน จะไม่มีการดำเนินการอื่นใด โดยจะส่งออกไปยัง STDERR (ไฟล์เอาต์พุตมาตรฐาน)
chdir('/etc') หรือเตือน "ไม่สามารถสลับไดเร็กทอรี";
ฟังก์ชั่น die คล้ายกับคำเตือน แต่จะออก โดยทั่วไปใช้เป็นข้อความแสดงข้อผิดพลาด:
chdir('/etc') หรือ die "ไม่สามารถสลับไดเร็กทอรี";
ในสคริปต์ Perl วิธีทั่วไปในการรายงานข้อผิดพลาดคือการใช้ฟังก์ชัน warn() หรือ die() เพื่อรายงานหรือสร้างข้อผิดพลาด สำหรับโมดูล Carp สามารถเพิ่มระดับการควบคุมข้อความที่สร้างขึ้นได้ โดยเฉพาะภายในโมดูล
โมดูล Carp มาตรฐานให้ทางเลือกแทนฟังก์ชัน warn() และ die() ซึ่งมีข้อมูลมากกว่าและใช้งานง่ายกว่าในการแปลข้อผิดพลาด เมื่อใช้ภายในโมดูล ชื่อโมดูลและหมายเลขบรรทัดจะรวมอยู่ในข้อความแสดงข้อผิดพลาด
ฟังก์ชัน carp สามารถส่งออกข้อมูลการติดตามของโปรแกรมได้ คล้ายกับฟังก์ชันเตือน และมักจะส่งข้อมูลนี้ไปที่ STDERR:
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { ปลาคาร์พ "ข้อผิดพลาดในโมดูล!";}1;
เรียกใช้โปรแกรมต่อไปนี้ในสคริปต์:
ใช้ T;ฟังก์ชั่น();
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
เกิดข้อผิดพลาดในโมดูล! ที่ test.pl บรรทัด 4
cluck() คล้ายกับ warn() และจัดเตรียมการติดตามย้อนกลับสแต็กจากตำแหน่งที่เกิดข้อผิดพลาด
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp qw(cluck);sub function { cluck "ข้อผิดพลาดในโมดูล!";}1;
เรียกใช้โปรแกรมต่อไปนี้ในสคริปต์:
ใช้ T;ฟังก์ชั่น();
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
เกิดข้อผิดพลาดในโมดูล! ที่ T.pm บรรทัด 9 T::function() เรียกว่าที่ test.pl บรรทัด 4
croak() เช่น die() จบสคริปต์
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { บ่น "ข้อผิดพลาดในโมดูล!";}1;
เรียกใช้โปรแกรมต่อไปนี้ในสคริปต์:
ใช้ T;ฟังก์ชั่น();
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
เกิดข้อผิดพลาดในโมดูล! ที่ test.pl บรรทัด 4
confess() คล้ายกับ die() แต่ให้การติดตามย้อนกลับแบบสแต็กจากตำแหน่งที่เกิดข้อผิดพลาด
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { สารภาพ "ข้อผิดพลาดในโมดูล!";}1;
เรียกใช้โปรแกรมต่อไปนี้ในสคริปต์:
ใช้ T;ฟังก์ชั่น();
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
เกิดข้อผิดพลาดในโมดูล! ที่ T.pm บรรทัด 9 T::function() เรียกว่าที่ test.pl บรรทัด 4