พิจารณาชั้นเรียนเล็ก ๆ ที่มีประโยชน์นี้:
class FunkyFile {
private $path;
private $contents = null;
public function __construct($path) {
$this->setPath($path);
}
private function setPath($path) {
if( !is_file($path) || !is_readable($path) )
throw new \InvalidArgumentException("Hm, that's not a valid file!");
$this->path = realpath($path);
return $this;
}
public function getContents() {
if( is_null($this->contents) ) {
$this->contents = @file_get_contents( $this->path );
if($this->contents === false)
throw new \Exception("Hm, I can't read the file, for some reason!");
}
return $this->contents;
}
}
นั่นเป็นการใช้ข้อยกเว้นอย่างสมบูรณ์แบบ จากFunkyFile's
มุมมองไม่มีอะไรที่สามารถทำได้เพื่อแก้ไขคำนามหากเส้นทางไม่ถูกต้องหรือfile_get_contents
ล้มเหลว สถานการณ์ที่ยอดเยี่ยมอย่างแท้จริง;)
แต่มีค่าสำหรับผู้ใช้ของคุณที่จะรู้ว่าคุณได้สะดุดกับเส้นทางของไฟล์ที่ไม่ถูกต้องที่ไหนสักแห่งในรหัสของคุณ? ตัวอย่างเช่น:
class Welcome extends Controller {
public function index() {
/**
* Ah, let's show user this file she asked for
*/
try {
$file = new File("HelloWorld.txt");
$contents = $file->getContents();
echo $contents;
} catch(\Exception $e) {
log($e->getMessage());
echo "Sorry, I'm having a bad day!";
}
}
}
นอกเหนือจากการบอกคนที่คุณกำลังมีวันที่แย่ตัวเลือกของคุณคือ:
รั้งท้าย
คุณมีวิธีรับข้อมูลอีกวิธีหนึ่งหรือไม่ ในตัวอย่างง่าย ๆ ของฉันข้างต้นดูเหมือนว่าจะไม่เกิดขึ้น แต่ให้พิจารณาสคีมาฐานข้อมูลหลัก / ทาส นายอาจจะล้มเหลวในการตอบโต้ แต่บางทีทาสก็ยังอยู่ที่นั่น (หรือกลับกัน)
มันเป็นความผิดของผู้ใช้หรือไม่?
ผู้ใช้ส่งข้อมูลผิดพลาดหรือไม่? บอกเธอเกี่ยวกับเรื่องนี้ คุณสามารถเห่าข้อความข้อผิดพลาดหรือจะดีและมาพร้อมกับข้อผิดพลาดที่มีรูปแบบเพื่อให้เธอสามารถพิมพ์ในเส้นทางที่ถูกต้อง
มันเป็นความผิดของคุณเหรอ?
และโดยคุณฉันหมายถึงทุกอย่างที่ไม่ใช่ผู้ใช้ดังนั้นตั้งแต่คุณพิมพ์เส้นทางของไฟล์ผิดไปจนถึงสิ่งที่ผิดปกติในเซิร์ฟเวอร์ของคุณ พูดอย่างเคร่งครัดถึงเวลาแล้วที่จะมีข้อผิดพลาด 503 HTTPเช่นกันบริการไม่พร้อมใช้งาน CI มีฟังก์ชั่นที่คุณสามารถสร้างshow_404()
show_503()
คำแนะนำคุณควรคำนึงถึงข้อยกเว้นอันธพาล CodeIgniter เป็นโค้ดที่ยุ่งเหยิงและคุณไม่มีทางรู้ว่าข้อยกเว้นจะปรากฏขึ้นเมื่อใด ในทำนองเดียวกันคุณอาจลืมข้อยกเว้นของคุณเองและตัวเลือกที่ปลอดภัยที่สุดคือการใช้ตัวจัดการข้อยกเว้นทั้งหมด ใน PHP คุณสามารถทำได้ด้วยset_exception_handler :
function FunkyExceptionHandler($exception) {
if(ENVIRONMENT == "production") {
log($e->getMessage());
show_503();
} else {
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
}
set_exception_handler("FunkyExceptionHandler");
และคุณยังสามารถดูแลข้อผิดพลาดโกงผ่านset_error_handler คุณสามารถเขียนตัวจัดการเดียวกันกับข้อยกเว้นหรือแปลงข้อผิดพลาดทั้งหมดเป็นErrorException
และให้ตัวจัดการข้อยกเว้นของคุณจัดการกับพวกเขา:
function FunkyErrorHandler($errno, $errstr, $errfile, $errline) {
// will be caught by FunkyExceptionHandler if not handled
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("FunkyErrorHandler");