Hướng dẫn does throwing an exception return php? - có ném ngoại lệ trả về php không?

Tôi thấy quy ước này hữu ích, vì khi cố gắng đọc mã hiện có, một lối thoát sớm có thể phá vỡ những kỳ vọng về luồng mã. và thường xứng đáng được ký hiệu. Nó gần như là một goto.early exit can break expectations of the code flow. and often deserves to be signposted. It's almost a goto.

Tôi đọc từ các khối ngoài cùng đến cùng trong, không liên tục, vì vậy bất cứ thứ gì được chôn trong một khối có vẻ ít quan trọng hơn ngay từ cái nhìn đầu tiên.

Comparing:

function doStuff {
  if (Y) {
    ##
    ## Stuff happens
    ##
  }
  else {
    ##
    ## Other Stuff happens
    ##
  }
  ##
  ## So I assume this always happens
  ##
}

with

function doStuff {
  if (Y) {
    ##
    ## Stuff happens
    ##
  }
  else {
    ##
    ## Other Stuff happens
    return; 
    # ^- this is easy to spot when scanning
    ##
  }
  ##
  ## This *usually* happens
  ##
}

Tôi thích cái sau, ngay cả khi nó có thể hơi dư thừa.

Tôi chấp nhận rằng điều đó chủ yếu là vì tôi có nhiều điều hơn khi xem 'Return' là một từ khóa quan trọng, so với số lần tôi phải mong đợi các ngoại lệ, nhưng tôi có thể phát hiện ra một 'trở lại độc lập;' . Ở khoảng cách xa khi cuộn nhanh.

Nếu tôi làm việc trên mã trong đó xử lý ngoại lệ là phương pháp quản lý dòng chảy thường xuyên hơn nhiều, tôi có thể trở nên nhạy cảm hơn khi phát hiện 'ném' làm từ khóa, nhưng tôi thì không.

Nhưng sau đó, tôi cũng có tội với biển chỉ dẫn dự phòng như:

function doStuff() {
  if (X) {
    ## Do this
  }
  else {
    ## Do that
  }
  /* Should not get here. */
  return NULL;
}

... nhưng chỉ trong những trường hợp cực đoan trong đó logic ở trên khó theo dõi, chẳng hạn như khi có những lối thoát hiểm sớm được mong đợi.


Các ngoại lệ được sử dụng để thay đổi luồng thông thường của tập lệnh nếu xảy ra lỗi được chỉ định.


Ngoại lệ là gì

Với Php 5 đã xuất hiện một cách xử lý các lỗi đối tượng mới.

Xử lý ngoại lệ được sử dụng để thay đổi luồng thông thường của thực thi mã nếu xảy ra một điều kiện lỗi (ngoại lệ) được chỉ định. Điều kiện này được gọi là một ngoại lệ.

Đây là những gì thường xảy ra khi một ngoại lệ được kích hoạt:

  • Trạng thái mã hiện tại được lưu
  • Việc thực thi mã sẽ chuyển sang hàm xử lý ngoại lệ được xác định trước (tùy chỉnh)
  • Tùy thuộc vào tình huống, trình xử lý sau đó có thể tiếp tục thực thi từ trạng thái mã đã lưu, chấm dứt thực thi tập lệnh hoặc tiếp tục tập lệnh từ một vị trí khác trong mã

Chúng tôi sẽ hiển thị các phương pháp xử lý lỗi khác nhau:

  • Sử dụng cơ bản các ngoại lệ
  • Tạo một trình xử lý ngoại lệ tùy chỉnh
  • Nhiều trường hợp ngoại lệ
  • Ném lại một ngoại lệ
  • Đặt trình xử lý ngoại lệ cấp cao nhất

Lưu ý: Các trường hợp ngoại lệ chỉ nên được sử dụng với các điều kiện lỗi và không nên được sử dụng để nhảy đến một nơi khác trong mã tại một điểm được chỉ định. Exceptions should only be used with error conditions, and should not be used to jump to another place in the code at a specified point.


Sử dụng cơ bản các ngoại lệ

Khi một ngoại lệ được ném, mã theo sau nó sẽ không được thực thi và PHP sẽ cố gắng tìm khối "bắt" phù hợp.

Nếu một ngoại lệ không bị bắt, một lỗi gây tử vong sẽ được đưa ra với một thông báo "ngoại lệ chưa được thực hiện".

Hãy cố gắng ném một ngoại lệ mà không bắt được nó:

1) & nbsp; & nbsp; & nbsp;} & nbsp; & nbsp; return true; }
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

// kích hoạt Checknum ngoại lệ (2); ?>
checkNum(2);
?>

Mã trên sẽ gặp lỗi như thế này:

Lỗi nghiêm trọng: Ngoại lệ 'ngoại lệ' với giá trị thông báo 'phải là 1 hoặc dưới' trong C: \ WebFolder \ test.php: 6 Stack Trace: #0 C: \ WebFolder \ test.php (12): CheckNum (28) #1 {main} ném vào C: \ WebFolder \ test.php trên dòng 6: Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Thử, ném và bắt

Để tránh lỗi từ ví dụ trên, chúng ta cần tạo mã thích hợp để xử lý một ngoại lệ.

Mã ngoại lệ thích hợp nên bao gồm:

  1. try - Một hàm sử dụng ngoại lệ phải nằm trong khối "thử". Nếu ngoại lệ không kích hoạt, mã sẽ tiếp tục như bình thường. Tuy nhiên, nếu các tác nhân ngoại lệ, một ngoại lệ là "ném"
  2. throw - Đây là cách bạn kích hoạt một ngoại lệ. Mỗi "ném" phải có ít nhất một "bắt"
  3. catch - Khối "bắt" lấy một ngoại lệ và tạo một đối tượng chứa thông tin ngoại lệ

Hãy cố gắng kích hoạt một ngoại lệ với mã hợp lệ:

1) & nbsp; & nbsp; & nbsp;} & nbsp; & nbsp; return true; }
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

// Trình kích hoạt ngoại lệ trong khối "thử" thử & nbsp; {& nbsp; & nbsp; Checknum (2); & nbsp; & nbsp; // Nếu ngoại lệ được ném, văn bản này sẽ không được hiển thị & nbsp; & nbsp; echo 'nếu bạn thấy điều này, số này là 1 hoặc thấp hơn'; }
try {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
}

// Bắt Exception Catch (Ngoại lệ $ e) & nbsp; {& nbsp; & nbsp; echo 'tin nhắn:'. $ e-> getMessage (); }?>
catch(Exception $e) {
  echo 'Message: ' .$e->getMessage();
}
?>

Mã trên sẽ gặp lỗi như thế này:

Thông báo: Giá trị phải là 1 hoặc dưới

Ví dụ giải thích:

Mã trên ném một ngoại lệ và bắt nó:

  1. Hàm Checknum () được tạo. Nó kiểm tra xem một số lớn hơn 1. Nếu có, một ngoại lệ được ném
  2. Hàm CheckNum () được gọi trong khối "thử"
  3. Ngoại lệ trong hàm CheckNum () được ném
  4. Khối "bắt" lấy ngoại lệ và tạo một đối tượng ($ e) chứa thông tin ngoại lệ
  5. Thông báo lỗi từ ngoại lệ được lặp lại bằng cách gọi $ e-> getMessage () từ đối tượng ngoại lệ

Tuy nhiên, một cách để vượt qua quy tắc "mỗi cú ném phải có" là đặt một trình xử lý ngoại lệ cấp cao nhất để xử lý các lỗi trượt qua.



Tạo một lớp ngoại lệ tùy chỉnh

Để tạo một trình xử lý ngoại lệ tùy chỉnh, bạn phải tạo một lớp đặc biệt với các chức năng có thể được gọi khi một ngoại lệ xảy ra trong PHP. Lớp phải là một phần mở rộng của lớp ngoại lệ.

Lớp ngoại lệ tùy chỉnh kế thừa các thuộc tính từ lớp ngoại lệ của PHP và bạn có thể thêm các chức năng tùy chỉnh vào nó.

Cho phép tạo một lớp ngoại lệ:

theo hàng().' trong '. $ this-> getfile () & nbsp; & nbsp; & nbsp; & nbsp ;.': '. $ this-> getMessage ().' không phải là địa chỉ e-mail hợp lệ '; & nbsp; & nbsp; & nbsp; & nbsp; return $ errorMsg; & nbsp; & nbsp;}}
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': '.$this->getMessage().' is not a valid E-Mail address';
    return $errorMsg;
  }
}

$ email = "";

Hãy thử & nbsp; {& nbsp; & nbsp; // kiểm tra if & nbsp; ; & nbsp; & nbsp; ném CustomException mới ($ email); & nbsp; & nbsp;}}
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
}

Catch (CustomException $ e) & nbsp; }?>
  //display custom message
  echo $e->errorMessage();
}
?>

Lớp mới là bản sao của lớp ngoại lệ cũ với việc bổ sung hàm errorMessage (). Vì nó là bản sao của lớp cũ và nó kế thừa các thuộc tính và phương thức từ lớp cũ, chúng ta có thể sử dụng các phương thức lớp ngoại lệ như getline () và getfile () và getMessage ().

Ví dụ giải thích:

Mã trên ném một ngoại lệ và bắt nó:

  1. Hàm Checknum () được tạo. Nó kiểm tra xem một số lớn hơn 1. Nếu có, một ngoại lệ được ném
  2. Hàm CheckNum () được gọi trong khối "thử"
  3. Ngoại lệ trong hàm CheckNum () được ném
  4. Khối "bắt" lấy ngoại lệ và tạo một đối tượng ($ e) chứa thông tin ngoại lệ
  5. Thông báo lỗi từ ngoại lệ được lặp lại bằng cách gọi $ e-> getMessage () từ đối tượng ngoại lệ

Tuy nhiên, một cách để vượt qua quy tắc "mỗi cú ném phải có" là đặt một trình xử lý ngoại lệ cấp cao nhất để xử lý các lỗi trượt qua.

Tạo một lớp ngoại lệ tùy chỉnh

Để tạo một trình xử lý ngoại lệ tùy chỉnh, bạn phải tạo một lớp đặc biệt với các chức năng có thể được gọi khi một ngoại lệ xảy ra trong PHP. Lớp phải là một phần mở rộng của lớp ngoại lệ.

Lớp ngoại lệ tùy chỉnh kế thừa các thuộc tính từ lớp ngoại lệ của PHP và bạn có thể thêm các chức năng tùy chỉnh vào nó.
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': '.$this->getMessage().' is not a valid E-Mail address';
    return $errorMsg;
  }
}

$ email = "";

Hãy thử & nbsp; {& nbsp; & nbsp; // kiểm tra if & nbsp; ; & nbsp; & nbsp; ném CustomException mới ($ email); & nbsp; & nbsp;}}
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

Catch (CustomException $ e) & nbsp; }?>
  echo $e->errorMessage();
}

Lớp mới là bản sao của lớp ngoại lệ cũ với việc bổ sung hàm errorMessage (). Vì nó là bản sao của lớp cũ và nó kế thừa các thuộc tính và phương thức từ lớp cũ, chúng ta có thể sử dụng các phương thức lớp ngoại lệ như getline () và getfile () và getMessage ().
  echo $e->getMessage();
}
?>

Ví dụ giải thích:

Mã trên ném một ngoại lệ và bắt nó:

  1. Hàm Checknum () được tạo. Nó kiểm tra xem một số lớn hơn 1. Nếu có, một ngoại lệ được ném
  2. Hàm CheckNum () được gọi trong khối "thử"
  3. Biến email $ được đặt thành một chuỗi là địa chỉ e-mail hợp lệ, nhưng chứa chuỗi "Ví dụ"
  4. Khối "thử" được thực thi và một ngoại lệ không được ném vào điều kiện đầu tiên
  5. Điều kiện thứ hai kích hoạt một ngoại lệ vì e-mail chứa chuỗi "Ví dụ"
  6. Khối "Bắt" bắt được ngoại lệ và hiển thị thông báo lỗi chính xác

Nếu ngoại lệ ném là của lớp CustomException và không có bắt giữ CustomException, chỉ có ngoại lệ cơ sở, thì ngoại lệ sẽ được xử lý ở đó.


Ném lại ngoại lệ

Đôi khi, khi một ngoại lệ được ném, bạn có thể muốn xử lý nó khác với cách tiêu chuẩn. Có thể ném một ngoại lệ lần thứ hai trong một khối "bắt".

Một tập lệnh nên ẩn lỗi hệ thống từ người dùng. Lỗi hệ thống có thể rất quan trọng đối với người dùng, nhưng không quan tâm đến người dùng. Để làm cho mọi thứ dễ dàng hơn cho người dùng, bạn có thể ném lại ngoại lệ bằng tin nhắn thân thiện với người dùng:

getMessage (). ' không phải là địa chỉ e-mail hợp lệ. '; & nbsp; & nbsp; & nbsp; & nbsp; return $ errorMsg; & nbsp; & nbsp;}}
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
    return $errorMsg;
  }
}

$ email = "";

thử & nbsp; {& nbsp; & nbsp; thử {& nbsp; & nbsp; ) & nbsp; {& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;} & nbsp; & nbsp; CustomException mới ($ email); & nbsp; & nbsp;}}
  try {
    //check for "example" in mail address
    if(strpos($email, "example") !== FALSE) {
      //throw exception if email is not valid
      throw new Exception($email);
    }
  }
  catch(Exception $e) {
    //re-throw exception
    throw new customException($email);
  }
}

Catch (CustomException $ e) & nbsp; }?>
  //display custom message
  echo $e->errorMessage();
}
?>

Ví dụ giải thích:

Mã trên kiểm tra nếu địa chỉ email chứa chuỗi "ví dụ" trong đó, nếu có, ngoại lệ được chuyển lại:

  1. Lớp CustomException () được tạo như một phần mở rộng của lớp ngoại lệ cũ. Bằng cách này, nó kế thừa tất cả các phương thức và thuộc tính từ lớp ngoại lệ cũ
  2. Hàm errorMessage () được tạo. Hàm này trả về một thông báo lỗi nếu địa chỉ e-mail không hợp lệ
  3. Biến email $ được đặt thành một chuỗi là địa chỉ e-mail hợp lệ, nhưng chứa chuỗi "Ví dụ"
  4. Khối "thử" chứa khối "thử" khác để có thể ném lại ngoại lệ
  5. Ngoại lệ được kích hoạt vì e-mail chứa chuỗi "Ví dụ"
  6. Khối "Catch" bắt được ngoại lệ và ném lại "CustomException"
  7. "CustomException" bị bắt và hiển thị thông báo lỗi

Nếu ngoại lệ không bị bắt trong khối "thử" hiện tại của nó, nó sẽ tìm kiếm một khối bắt ở "cấp cao hơn".


Đặt trình xử lý ngoại lệ cấp cao nhất

Hàm set_exception_handler() đặt chức năng do người dùng xác định để xử lý tất cả các ngoại lệ chưa được thực hiện:

getMessage (); }
function myException($exception) {
  echo "Exception: " . $exception->getMessage();
}

set_exception_handler ('myException');

ném ngoại lệ mới ('ngoại lệ chưa được xảy ra'); ?>
?>

Đầu ra của mã trên phải là một cái gì đó như thế này:

Ngoại lệ: Ngoại lệ không xảy ra Uncaught Exception occurred

Trong mã trên không có khối "bắt". Thay vào đó, trình xử lý ngoại lệ cấp cao nhất đã kích hoạt. Chức năng này nên được sử dụng để bắt các ngoại lệ chưa học.


Quy tắc cho các trường hợp ngoại lệ

  • Mã có thể được bao quanh trong một khối thử, để giúp nắm bắt các ngoại lệ tiềm năng
  • Mỗi khối thử hoặc "ném" phải có ít nhất một khối đánh bắt tương ứng
  • Nhiều khối bắt có thể được sử dụng để bắt các lớp ngoại lệ khác nhau
  • Các trường hợp ngoại lệ có thể được ném (hoặc ném lại) trong một khối bắt trong khối thử

Một quy tắc đơn giản: Nếu bạn ném một cái gì đó, bạn phải bắt nó.



Ném trở lại ngoại lệ?

Sau khi bạn gọi ném, phương thức sẽ quay lại ngay lập tức và không có mã nào sau đó sẽ được thực thi.Điều này cũng đúng nếu bất kỳ trường hợp ngoại lệ nào bị ném và không bị bắt trong một khối thử / bắt. and no code following it will be executed. This is also true if any exceptions are thrown and not caught in a try / catch block.

Có phải ném một ngoại lệ giống như trả lại một giá trị?

Ví dụ, lưu ý rằng việc ném một ngoại lệ có nghĩa là phương pháp đã được sử dụng sai hoặc có lỗi nội bộ, trong khi trả về một ngoại lệ có nghĩa là mã lỗi đã được xác định thành công.throwing an exception means that the method was used wrong or had an internal error, while returning an exception means that the error code was identified successfully.

Điều gì xảy ra khi một ngoại lệ được kích hoạt trong PHP?

Xử lý ngoại lệ được sử dụng để thay đổi luồng thông thường của thực thi mã nếu xảy ra một điều kiện lỗi (ngoại lệ) được chỉ định.Điều kiện này được gọi là một ngoại lệ.Đây là những gì thường xảy ra khi một ngoại lệ được kích hoạt: trạng thái mã hiện tại được lưu.The current code state is saved.

Ném một ngoại lệ dừng thực thi PHP?

Khi một ngoại lệ được ném, mã theo sau nó sẽ không được thực thi.Nếu một ngoại lệ không bị bắt, một lỗi nghiêm trọng sẽ xảy ra với một thông báo "ngoại lệ chưa được thực hiện".