Mục đích của lớp ngoại lệ chung trong php là gì?

Nó cho phép bạn phân biệt giữa các lỗi. Giả sử bạn có một mã đưa ra cùng một Ngoại lệ cho nhiều lỗi, bạn có thể sử dụng tham số 'mã' tùy chọn trong khai báo đối tượng để phân biệt giữa chúng

Trong ví dụ trên trang đó, họ gọi một Ngoại lệ mới có mã là 30, vì vậy khi bạn kiểm tra đối tượng được xuất ra, nó sẽ trả về '30'

ví dụ

try {
    if [$something] {
        throw new Exception["Generic Error",1];
    }
    else {
        throw new Exception["Generic Error #2",2];
    }
}
catch [Exception $e] {
    echo "Error ID ".$e->getCode[]." was thrown.";
}

Kể từ khi PHP 5 được phát hành, Exception được thêm vào PHP như một tính năng của ngôn ngữ lập trình hướng đối tượng. Theo định nghĩa, Ngoại lệ là một sự kiện đặc biệt trong khi thực hiện chương trình. Trong PHP, Ngoại lệ chỉ đơn giản là một đối tượng [một thể hiện của lớp Ngoại lệ]. Khi một ngoại lệ xảy ra, PHP sẽ tạm dừng luồng thực thi hiện tại và tìm kiếm một trình xử lý, sau đó nó sẽ tiếp tục thực thi bằng mã của trình xử lý. Nếu không tìm thấy trình xử lý nào, PHP Fatal Error sẽ được đưa ra với thông báo "Uncaught Exception. " tin nhắn và chương trình kết thúc

Khi nào nên sử dụng Ngoại lệ

Ngoại lệ tốt cho việc xử lý các trường hợp ngoại lệ trong chương trình của bạn, tuy nhiên nó không phải là giải pháp cho tất cả các trường hợp lỗi. Đôi khi hoàn toàn ổn khi trả về giá trị boolean FALSE. Đôi khi, tốt hơn hết là bạn nên loại bỏ các ngoại lệ thay vì trả về các mã lỗi kỳ lạ. Do đó, điều rất quan trọng là phải hiểu khi nào nên sử dụng Ngoại lệ và khi nào thì không.

Đến bây giờ, tất cả chúng ta đều biết một ngoại lệ nên được đưa ra khi một tình huống đặc biệt xảy ra. Nhưng nếu tình huống ngoại lệ có vẻ khá tùy tiện, thì điều gì được coi là tình huống "ngoại lệ"?

Đây là một quy tắc tốt. vì các tình huống ngoại lệ không thường xuyên xảy ra, nếu bạn cung cấp các giá trị chính xác cho hàm của mình và loại bỏ ngoại lệ đã ném, nếu sau đó hàm không thành công, thì ngoại lệ được sử dụng không chính xác

Hãy xem xét một số ví dụ cụ thể

  • Nếu bạn tạo một chức năng để lưu đầu vào của người dùng vào cơ sở dữ liệu, khi kết nối cơ sở dữ liệu không thành công, một ngoại lệ sẽ được đưa ra
  • Đối với chức năng tương tự, bạn tạo trình xác thực để kiểm tra đầu vào của người dùng. Khi một giá trị không hợp lệ được cung cấp, bạn không nên ném một ngoại lệ. Giá trị không hợp lệ là một trường hợp khá thường xuyên đối với lớp trình xác thực

Một trường hợp sử dụng tốt của Ngoại lệ

Ở đây chúng tôi có một ví dụ về trả lại mã lỗi để chỉ ra các trường hợp lỗi

    ...
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            return -2;
        }
        if [$this->tooManyLoginAttempts[]] {
            return -1;
        }
        return 1;
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}

Mã khách hàng có thể là một cái gì đó tương tự như dưới đây

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}

Ở đây chúng tôi có thể phát hiện ra một số vấn đề với mã lỗi

  • Bản thân mã lỗi không chứa thông tin liên quan đến lỗi, điều này khiến chúng rất khó bảo trì
  • Các mã lỗi dẫn đến số lượng câu lệnh if/else trong mã của máy khách, tùy thuộc vào số lượng. [Các câu điều kiện nên được loại bỏ càng nhiều càng tốt, để làm cho mã của chúng ta sạch sẽ]

Hãy cấu trúc lại mã để sử dụng ngoại lệ

class User {
    ...
 
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            throw new InvalidCredentialException['Invalid username or password'];
        }
 
        if [$this->tooManyLoginAttempts[]] {
            throw new LoginAttemptsException['Too many login attempts'];
        }
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}

Và mã khách hàng có thể được cấu trúc lại như

try {
    $user = new User[];
    $user->login[];
    $user->redirectToUserPage[];
} catch [InvalidCredentialException $e] {
    log[$e->getMessage[]];
} catch [LoginAttemptsException $e] {
    log[$e->getMessage[]];
}

Như chúng ta có thể thấy, bằng cách sử dụng các ngoại lệ, mẫu mã thứ hai truyền tải các thông báo về lỗi rõ ràng hơn nhiều. Ngoài ra, trong mã máy khách, bằng cách loại bỏ các câu lệnh có điều kiện, mã trở nên dễ hiểu

Một trường hợp lạm dụng ngoại lệ

Một cách phổ biến để lạm dụng ngoại lệ là sử dụng chúng để kiểm soát luồng logic của ứng dụng. Nó không chỉ gây nhầm lẫn mà còn làm chậm mã của bạn. Để nhấn mạnh một lần nữa, ngoại lệ được sử dụng để nêu ra các tình huống ngoại lệ

Dưới đây là một ví dụ về việc lạm dụng ngoại lệ, điều này không được khuyến khích

As we can see, by using exceptions, the second code sample conveys messages about the errors much more clearly. Beyond that, in the client code, by eliminating conditional statements, the code become self-explanatory.

A case of misusing Exception

One common way of misusing exceptions is using them to control the flow of application logic. It is not only confusing, but also slows down your code. To emphasize again, exception is used to raise exceptional situations.

Below is one example of of misusing exceptions, which is discouraged.

Hàm register[] sử dụng các ngoại lệ để ủy thác các tác vụ tạo tài khoản. Điều này rõ ràng là chống lại các quy tắc ngoại lệ. Mặc dù PHP không ngăn cản bạn, nhưng bạn nên nghiêm cấm bản thân làm điều này

Cách sử dụng Ngoại lệ

Bốn từ khóa được liên kết với Ngoại lệ. họ đang. ném , thử , bắt và cuối cùng. Một đối tượng ngoại lệ được ném [ throw ] trong một phương thức khi một sự kiện ngoại lệ xảy ra. Các máy khách gọi phương thức thường sẽ đặt phương thức đó trong một khối thử và bắt nó bằng một số mã xử lý. Một khối cuối cùng đảm bảo mã bên trong khối sẽ luôn được thực thi

Phi

Tất cả các ngoại lệ trong PHP là một lớp hoặc lớp con của Ngoại lệ. Nó nhận ba tham số tùy chọn trong hàm tạo của nó

public __construct [[ string $message = "" [, int $code = 0 [, Exception $previous = NULL]
  • tin nhắn $. Thông báo ngoại lệ. Thông báo này cung cấp một số thông tin có thể đọc được của con người. Và thường cung cấp tham số này khi khởi tạo một ngoại lệ
  • mã $. Nó rất hữu ích để xác định các loại ngoại lệ thuộc cùng một lớp
  • $trước. Ngoại lệ trước cái hiện tại. Điều này thường được sử dụng khi chúng ta muốn ném lại một ngoại lệ trong một khối bắt

Dưới đây là một ví dụ về cú pháp PHP để ném một ngoại lệ

throw new Exception['some error message'];

Từ khóa ở đây là ném. Lưu ý rằng trước tiên chúng ta cần khởi tạo một đối tượng ngoại lệ

Nắm lấy

Khi chúng ta cần bắt ngoại lệ, chúng ta đặt callee trong khối try-catch như bên dưới

________số 8

Khối bắt là nơi chúng tôi đặt mã xử lý của mình. Việc triển khai xử lý ngoại lệ chi tiết khác nhau tùy thuộc vào thiết kế ứng dụng. Ví dụ: chúng tôi có thể cố gắng khôi phục ngoại lệ nhiều nhất có thể và nếu không thể, chúng tôi có thể chuyển hướng người dùng đến trang hỗ trợ khách hàng. Nếu chúng ta bỏ mặc nó, PHP cuối cùng sẽ chấm dứt chương trình và để lại cho người dùng một trang thông báo lỗi vô nghĩa, điều này không được khuyến khích

Hiệu ứng bong bóng ngoại lệ

Nếu bạn đang sử dụng một số loại khung, các ngoại lệ có thể được xử lý ngay cả khi bạn chưa bao giờ thực sự tạo bất kỳ trình xử lý nào cho chúng. Đó là bởi vì các ngoại lệ nổi lên và khung của bạn cuối cùng sẽ xử lý chúng. Một ví dụ đơn giản về hiệu ứng bong bóng ngoại lệ là

function methodA[]
{
    throw new Exception['error from methodA'];
}
 
function methodB[]
{
    methodA[];
}
 
function methodC[]
{
    try {
        methodB[];
    } catch [Exception $e] {
        // handle error gracefully
    }
}

Trong mã mẫu, khi phương thức được gọi, nó gọi phương thức B, phương thức này gọi trực tiếp phương thức A. Một ngoại lệ được ném vào phương thức A, vì phương thức B không xử lý nó. Sau đó, nó chuyển sang phương thức C, xử lý ngoại lệ một cách duyên dáng. Trong ví dụ này, mặc dù phương thức C không gọi trực tiếp phương thức A, bởi vì ngoại lệ nổi lên ngăn xếp, nó vẫn được xử lý một cách duyên dáng ở cuối

Nhiều khối bắt

Một phương thức có thể chứa các ngoại lệ khác nhau. một số có thể được ném trực tiếp bởi chính chúng và một số có thể được tạo ra từ ngăn xếp bên dưới của chúng. Khối catch được thiết kế để xử lý nhiều ngoại lệ, vì vậy chúng ta có thể có nhiều khối catch để xử lý các ngoại lệ khác nhau. Một báo trước ở đây là vị trí quan trọng

Trong nhiều khối bắt, PHP chọn khối đầu tiên khớp với loại ngoại lệ được ném. Một quy tắc tốt để định vị các khối bắt là từ khối cụ thể hơn đến khối ít cụ thể hơn

Hãy xem nó trong một ví dụ

    ...
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            return -2;
        }
        if [$this->tooManyLoginAttempts[]] {
            return -1;
        }
        return 1;
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}
0

Trong mã mẫu, rõ ràng khối bắt ngoại lệ sẽ được chọn. Bây giờ hãy thay đổi phương thức để ném Ngoại lệ

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
0

Bạn nghĩ khối bắt nào sẽ được chọn? . Bởi vì ExceptionA là lớp cha của ExceptionB, khi ExceptionB được ném ra, khối bắt ExceptionA xuất hiện trước và khớp với loại của ngoại lệ được ném, khiến ExceptionB là một thể hiện của ExceptionA

Điều này có thể được khắc phục bằng cách định vị chúng từ loại cụ thể hơn sang loại ít cụ thể hơn, như minh họa bên dưới

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
1

tin nhắn theo dõi

Vì các ngoại lệ có thể được đưa ra bất cứ đâu trong chương trình của bạn, điều rất quan trọng là phải tìm ra nguyên nhân gốc rễ. Ngoại lệ cung cấp nhiều API khác nhau để giúp dễ dàng theo dõi nơi ngoại lệ đến từ đâu

Bảy phương thức công khai được trích xuất từ ​​​​tệp thủ công PHP

  • chuỗi công khai cuối cùng getMessage [ void ]
  • ngoại lệ công khai cuối cùng getPrevious [ void ]
  • getCode hỗn hợp công khai cuối cùng [ void ]
  • chuỗi công khai cuối cùng getFile [ void ]
  • int getLine công khai cuối cùng [ void ]
  • mảng công khai cuối cùng getTrace [ void ]
  • chuỗi công khai cuối cùng getTraceAsString [ void ]

Và chúng ta có thể sử dụng chúng để theo dõi chi tiết của ngoại lệ bị ném

  • Ngoại lệ. getMessage - Nhận thông báo Ngoại lệ
  • Ngoại lệ. getPrevious - Trả về trước đó
  • Ngoại lệ Ngoại lệ. getCode - Lấy mã ngoại lệ
  • Ngoại lệ. getFile - Lấy tệp trong đó xảy ra ngoại lệ
  • Ngoại lệ. getLine - Nhận dòng trong đó ngoại lệ xảy ra
  • Ngoại lệ. getTrace - Nhận dấu vết ngăn xếp
  • Ngoại lệ. getTraceAsString - Lấy dấu vết ngăn xếp dưới dạng chuỗi

Hãy đưa nó vào hành động

Đối với mục đích trình diễn, hãy giả sử rằng chúng ta có một phương thức createAccount[], phương thức này sẽ đưa ra một Ngoại lệ khi địa chỉ email không hợp lệ

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
2

Chúng tôi có thể nhận được thông tin gì nếu kích hoạt ngoại lệ?

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
3

Chạy tập lệnh từ CLI, chúng tôi nhận được như sau

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
4

Bên cạnh thông tin theo dõi rõ ràng, chúng ta cũng có thể biết rằng, mã mặc định là 0 và ngoại lệ trước đó là null khi khởi tạo một đối tượng ngoại lệ

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
5

Một điểm nữa chúng tôi muốn giải quyết ở đây là một ngoại lệ được tạo khi nó được khởi tạo, không phải khi nó được ném ra. Vì vậy, các API ngoại lệ sẽ cung cấp cho bạn thông tin liên quan đến thời gian một ngoại lệ được khởi tạo

Ví dụ: trong phương thức bên dưới, Ngoại lệ. getLine sẽ trả về 2

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
6

cuối cùng

Trước PHP 5. 5, không có khối cuối cùng trong PHP. Một vấn đề nổi lên. Nếu chúng tôi muốn đảm bảo rằng một đoạn mã luôn chạy bất kể khối bắt nào được chọn, chúng tôi phải đặt đoạn mã đó vào từng khối bắt

Để giải quyết vấn đề này, khối cuối cùng đã được giới thiệu kể từ PHP 5. 5. Mã bên trong khối finally sẽ luôn được thực thi sau khối catch. Chúng ta thậm chí có thể chỉ dùng try/catch mà không dùng catch

Khối này là nơi để chúng tôi thực hiện một số công việc dọn dẹp. Các tác vụ như khôi phục giao dịch cơ sở dữ liệu, đóng kết nối cơ sở dữ liệu, giải phóng khóa tệp, v.v. Cách sử dụng của nó khá đơn giản

Ví dụ: để sử dụng nó cùng với các khối thử/bắt

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
7

Chỉ sử dụng thử/cuối cùng chặn

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
8

Tạo ngoại lệ tùy chỉnh đầu tiên của bạn

Ném ngoại lệ tùy chỉnh cho phép mã máy khách xử lý trường hợp lỗi theo cách được công nhận. Ví dụ: khi ném ngoại lệ cơ sở dữ liệu, việc tắt quá trình đã hoàn tất là hợp lý. Tuy nhiên, trong trường hợp đầu vào của người dùng không hợp lệ, chúng tôi có thể chỉ muốn ghi lại thông báo lỗi

Bằng cách tạo các ngoại lệ tùy chỉnh, chúng tôi chủ động thể hiện các trường hợp lỗi trong mã của mình. Điều này không chỉ giúp khách hàng tránh được những cạm bẫy mà còn cung cấp cho họ đủ thông tin để xử lý các trường hợp lỗi một cách tự tin.

Như tất cả các ngoại lệ trong PHP 5. x sử dụng Ngoại lệ làm cơ sở, chúng tôi thực sự đang mở rộng Ngoại lệ để tạo ngoại lệ tùy chỉnh của mình. Trong ví dụ này, hãy xem lại mã trước đây của chúng tôi

$user = new User[];
$result = $user->login[];
if [-2 == $result] {
    log['invalid username or password'];
} else if [-1 == $result] {
    log['too many login attempts'];
} else if [1 == $result] {
    $user->redirectToUserPage[];
}
9

Chúng tôi có hai ngoại lệ tùy chỉnh ở đây [InvalidCredentialException và LoginAttemptsException]. Họ thực sự nên thuộc một loại. Và họ sẽ được chỉ định các tin nhắn khác nhau

Vì UnlimitedCredentialException và LoginAttemptsException là các trường hợp lỗi đối với lỗi thời gian chạy đăng nhập không hợp lệ, nên việc tạo một ngoại lệ có tên là InvalidLoginException và sử dụng nó cho hai trường hợp lỗi ở trên là hợp lý

Nó đủ đơn giản để tạo một ngoại lệ tùy chỉnh chỉ với một dòng mã

class User {
    ...
 
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            throw new InvalidCredentialException['Invalid username or password'];
        }
 
        if [$this->tooManyLoginAttempts[]] {
            throw new LoginAttemptsException['Too many login attempts'];
        }
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}
0

Chúng ta có thể cấu trúc lại mã trước đó để sử dụng lớp ngoại lệ mới được tạo

class User {
    ...
 
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            throw new InvalidCredentialException['Invalid username or password'];
        }
 
        if [$this->tooManyLoginAttempts[]] {
            throw new LoginAttemptsException['Too many login attempts'];
        }
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}
1

Một mẹo nhỏ

Một vấn đề tiềm ẩn có thể xuất hiện trong thời gian ngắn nếu chúng tôi đang sử dụng UnlimitedLoginException với quá nhiều thông báo khác nhau. Vấn đề rất dễ minh họa

Hãy tưởng tượng ở đâu đó trong mã của bạn, chúng ta cần ném một UnlimitedpLuginException khác khi tài khoản người dùng bị chặn. Chúng tôi sẽ đưa ra chính xác UnlimitedLoginException, nhưng với các thông báo khác nhau. Điều tương tự lại xảy ra và chúng tôi sẽ lặp lại các hành động tương tự. Danh sách thêm lên. Bây giờ hãy tưởng tượng làm điều này cho các loại ngoại lệ khác nhau. Chúng tôi sẽ mất dấu vết với tư cách là nhà phát triển

Vì vậy, đây là một mẹo nhỏ. chúng tôi chuyển nhiệm vụ tạo ngoại lệ sang lớp UnlimitedLoginException

class User {
    ...
 
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            throw new InvalidCredentialException['Invalid username or password'];
        }
 
        if [$this->tooManyLoginAttempts[]] {
            throw new LoginAttemptsException['Too many login attempts'];
        }
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}
2

Bây giờ mã khách hàng trở thành

class User {
    ...
 
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            throw new InvalidCredentialException['Invalid username or password'];
        }
 
        if [$this->tooManyLoginAttempts[]] {
            throw new LoginAttemptsException['Too many login attempts'];
        }
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}
3

Khi việc khởi tạo ngoại lệ được chuyển sang một khối chức năng, chúng ta sẽ có nhiều không gian hơn và tự do hơn để làm nhiều thứ thú vị hơn, so với một dòng duy nhất trong khối if trước đây

Bằng cách giữ tất cả chúng ở một vị trí tập trung, chính là lớp ngoại lệ, nó không chỉ tạo ra một cơ sở mã dễ bảo trì hơn mà còn tạo cơ hội cho khách hàng xem nhanh chính xác ngoại lệ mà họ mong đợi

ngoại lệ SPL

Tạo ngoại lệ tùy chỉnh của riêng bạn là điều tuyệt vời, nhưng nó cần một số năng lượng tinh thần để đưa ra một cái tên có ý nghĩa. Đặt tên rất khó, được cho là một trong những điều khó nhất trong lập trình

Thư viện PHP chuẩn [SPL] cung cấp một bộ Ngoại lệ chuẩn. Chúng ta nên sử dụng chúng vì lợi ích của chính chúng ta. Chúng bao gồm một danh sách các trường hợp lỗi phổ biến, có thể giúp chúng tôi tiết kiệm năng lượng nếu chúng tôi tự mình ra ngoài. Ngoài ra, chúng tôi cũng có thể mở rộng từ các Ngoại lệ tiêu chuẩn này để làm cho chúng cụ thể hơn đối với miền của chúng tôi

Trong phần này, chúng ta sẽ xem xét 14 Ngoại lệ SPL, giải thích chúng bằng các thuật ngữ đơn giản nhất để bạn có thể sử dụng chúng vào lần tới trong dự án của riêng mình

class User {
    ...
 
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            throw new InvalidCredentialException['Invalid username or password'];
        }
 
        if [$this->tooManyLoginAttempts[]] {
            throw new LoginAttemptsException['Too many login attempts'];
        }
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}
4

Có hai loại ngoại lệ SPL chính. Chúng là LogicException và RuntimeException, Dưới mỗi một trong số chúng, có một vài lớp ngoại lệ phụ mô tả các trường hợp lỗi cụ thể hơn

Lỗi logic

Ngoại lệ logic

Không khó để nói từ cái tên của nó, LogicException bao gồm các trường hợp lỗi liên quan đến logic. Vì nó là lớp cha cho một số ngoại lệ cụ thể hơn nên nó hơi chung chung. Khi mã của bạn trả về hoặc nhận thứ gì đó không logic, có lỗi logic. Khi trường hợp lỗi được xác định là lỗi logic, hãy sử dụng LogicException nếu bạn không thể tìm thấy trường hợp phù hợp hơn từ các lớp con của nó

BadFunctionCallException

Khi một hàm không tồn tại được gọi hoặc các tham số sai được cung cấp cho một hàm, ngoại lệ này sẽ bị ném. Vì ngoại lệ này bao gồm phạm vi chức năng, không phải phương thức trong một lớp, nên nó chủ yếu do PHP ném ra

BadMethodCallException

Khi một phương thức không tồn tại của một lớp được gọi hoặc các tham số sai được cung cấp cho phương thức đó, một BadFunctionCallException có thể được đưa ra. Mặc dù ngoại lệ này tương tự như BadFunctionCallException, nhưng nó được thiết kế cho phạm vi lớp

Ngoại lệ tên miền

Tên miền ở đây đề cập đến doanh nghiệp mà mã của chúng tôi hoạt động. Khi một tham số hợp lệ theo kiểu dữ liệu của nó, nhưng không hợp lệ đối với miền, có thể ném DomainException

Ví dụ: trong một chức năng thao tác hình ảnh phổ quát, transformImage[$imageType] , nên ném ngoại lệ DomainException khi $imageType chứa một loại hình ảnh không hợp lệ. Đối với miền này, loại hình ảnh không hợp lệ là lỗi miền

Ngoại lệ đối số không hợp lệ

Điều này là đơn giản, như tên của nó nói. nó sẽ được ném khi một đối số không hợp lệ được cung cấp

PHP5 giới thiệu gợi ý kiểu, tuy nhiên nó chưa hoạt động với các kiểu vô hướng như int, string. Để làm cho nó hoạt động, chúng tôi ném InvalidArgumentException khi loại vô hướng không đáp ứng yêu cầu

Độ dàiNgoại lệ

Chúng tôi có thể sử dụng ngoại lệ này khi độ dài của nội dung nào đó không hợp lệ. Ví dụ: mật khẩu cần có ít nhất 8 ký tự

OutOfRangeNgoại lệ

Sử dụng ngoại lệ này khi một chỉ mục không hợp lệ được truy cập. Từ khóa ở đây là phạm vi

RuntimeException là tên bắt nguồn từ ngôn ngữ biên dịch, chẳng hạn như Java. Trong Java, có hai loại ngoại lệ chính. kiểm tra ngoại lệ và ngoại lệ thời gian chạy. Trình biên dịch sẽ không biên dịch mã cho đến khi tất cả ngoại lệ đã kiểm tra được xử lý [trong khối bắt]. Ngoại lệ thời gian chạy chỉ có thể được phát hiện trong thời gian chạy và không bắt buộc phải đặt các ngoại lệ này trong khối bắt

Vì PHP không phải là ngôn ngữ biên dịch, nên chúng ta có thể coi "thời gian biên dịch" của nó là thời gian chúng ta viết mã và "thời gian chạy" của nó là thời gian thực thi mã. Các ngoại lệ "Thời gian biên dịch" có thể được phát hiện trong thời gian phát triển, ví dụ: tham số kiểu dữ liệu không hợp lệ

Để tránh nhầm lẫn, hãy nhớ rằng các ngoại lệ logic được thảo luận ở trên là dành cho "thời gian biên dịch"

Các lớp con của RuntimeException bao gồm các tình huống cụ thể hơn. Sử dụng ngoại lệ này nếu bạn không thể tìm thấy một ngoại lệ phù hợp hơn từ các lớp con của nó

OutOfBoundsNgoại lệ

Ngoại lệ này được sử dụng khi một chỉ mục không hợp lệ được gọi. Đừng nhầm lẫn với OutOfRangeException, OutOfBoundsException là một ngoại lệ trong thời gian chạy

Ví dụ: khi người dùng tạo cấu trúc dữ liệu mảng và khi một chỉ mục không hợp lệ được gọi, thì OutOfBoundsException sẽ được ném ra. Trong khi cố gắng lấy ngày trong tuần bằng cách sử dụng 8 sẽ ném OutOfRangeException

class User {
    ...
 
    public function login[]
    {
        if [$this->invalidUsernameOrPassword[]] {
            throw new InvalidCredentialException['Invalid username or password'];
        }
 
        if [$this->tooManyLoginAttempts[]] {
            throw new LoginAttemptsException['Too many login attempts'];
        }
    }
 
    public function redirectToUserPage[]
    {
        ...
    }
}
5

Tràn ngoại lệ

Khi một thùng chứa có dung lượng hạn chế được yêu cầu lấp đầy nhiều hơn mức có thể chứa, ngoại lệ này có thể được đưa ra

Phạm vi ngoại lệ

Ngoại lệ này dành cho các trường hợp lỗi chung liên quan đến phạm vi tại "thời gian chạy"

UnderflowException

Đối lập với OverflowException là UnderflowException. Khi một thùng chứa trống được yêu cầu xóa một phần tử, ngoại lệ này có thể được ném

UnexpectedValueException

Đơn giản như tên gọi của nó, khi một giá trị không mong muốn được nâng lên hoặc truy cập, chúng tôi sẽ ném ngoại lệ này

Đó là tất cả các ngoại lệ được cung cấp bởi PHP SPL. Chúng ta phải luôn ném ngoại lệ chính xác nhất cho trường hợp lỗi. Chắc chắn, một ngoại lệ có thể phù hợp với nhiều ngoại lệ, trong trường hợp đó, bạn có thể chọn một ngoại lệ

Một thông báo ngoại lệ có ý nghĩa đi một chặng đường dài hướng tới một dự án có thể duy trì

Kết thúc

Hy vọng rằng hướng dẫn đơn giản này đã giúp bạn phát triển. Nếu bạn thích bài đăng của chúng tôi, vui lòng theo dõi chúng tôi trên Twitter và giúp truyền bá thông tin. Chúng tôi cần sự hỗ trợ của bạn để tiếp tục. Chúng tôi đã bỏ lỡ bất cứ điều gì?

Ngoại lệ chung trong PHP là gì?

Ném ngoại lệ trong PHP. Ném một ngoại lệ PHP chung chung gần như đơn giản như âm thanh. Tất cả những gì cần làm là khởi tạo một đối tượng ngoại lệ—với tham số đầu tiên của hàm tạo Ngoại lệ là thông báo lỗi—và sau đó, "ném" nó . ném Ngoại lệ mới ['Thông báo ngoại lệ']

Mục đích của một ngoại lệ là gì?

Ngoại lệ cung cấp phương tiện để tách chi tiết về những việc cần làm khi có điều gì đó khác thường xảy ra khỏi logic chính của chương trình . Trong lập trình truyền thống, phát hiện lỗi, báo cáo và xử lý thường dẫn đến mã spaghetti khó hiểu.

Việc sử dụng lớp ngoại lệ là gì?

Lớp Exception và các lớp con của nó là một dạng Throwable chỉ ra các điều kiện mà một ứng dụng hợp lý có thể muốn nắm bắt . Lớp Ngoại lệ và bất kỳ lớp con nào không phải là lớp con của RuntimeException đều là ngoại lệ được kiểm tra.

Xử lý ngoại lệ chung là gì?

Thay vì thêm các khối bắt khác nhau cho các ngoại lệ riêng lẻ vào khối thử, một lập trình viên bận rộn có thể chỉ cần gói các lời gọi phương thức trong một khối thử/bắt để bắt các Ngoại lệ chung Như thế này try{ } catch[Exception e] {} Phương pháp này được gọi là

Chủ Đề