Phiên bản PHP nào được thêm xử lý ngoại lệ?

Các ngoại lệ trong ngôn ngữ lập trình cung cấp một cách để mã ứng dụng phát sinh và xử lý các tình huống ngoại lệ và ngôn ngữ PHP không phải là ngoại lệ

Show

PHP cung cấp nhiều khả năng khác nhau để sử dụng Ngoại lệ trong mã PHP, chẳng hạn như trình xử lý ngoại lệ chung, cú pháp

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 cơ bản, cú pháp
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 xếp tầng và kết hợp, bắt ngoại lệ chỉ với loại của nó và các khối
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
4

Trong PHP8. 0, một số hàm bên trong PHP sẽ đưa ra các ngoại lệ tiêu chuẩn

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
0 và
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1, điều đó có nghĩa là bạn sẽ thấy ngày càng nhiều ngoại lệ và cách xử lý ngoại lệ trong mã PHP

Bài viết này cố gắng khám phá tác động hiệu suất của việc xử lý và đưa ra các ngoại lệ

trường hợp thử nghiệm

Lưu ý rằng các Ngoại lệ với từ khóa

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 hoặc việc sử dụng các khối
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 có thời gian thực hiện rất nhỏ. Rất khó có khả năng việc sử dụng Ngoại lệ là nút cổ chai của bất kỳ ứng dụng nào

Điểm chuẩn này nhằm so sánh tác động hiệu suất tương đối của việc sử dụng Ngoại lệ và cách nó tiến triển qua các phiên bản PHP

Trong điểm chuẩn, chúng ta sẽ xem xét 6 trường hợp thử nghiệm

  1. Không
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1/
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2. Kiểm tra mà không có bất kỳ xử lý ngoại lệ nào cả
  2. function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1/
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2,
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    9 trong khối thử. Trả về một giá trị từ bên trong khối
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1
  3. function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1/
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2, không có ngoại lệ. Sử dụng khối
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1/
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2, nhưng không
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2 bất kỳ Ngoại lệ nào
  4. function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1/nhiều
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2, không có ngoại lệ. Tương tự như #3, nhưng với nhiều khối
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2 xếp tầng
  5. Ngoại lệ
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1/
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2,
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2. Bắt ngoại lệ từ khối
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2 đầu tiên
  6. function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    1/nhiều
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2, ngoại lệ
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2. Bắt ngoại lệ từ khối
    function case_try_successful_return(): ?int {
        try {
            return null;
        }
        catch(Exception $ex) {}
    }
    2 cuối cùng

1. Không function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }1/function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2

Đây là bài kiểm tra cơ bản mà không có khối

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 nào cả

function case_return(): ?int {
    return null;
}

2. function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }1/function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2, function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }9 trong vòng function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }1

Một khối

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 đơn giản, nhưng trả về ngay trong khối
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1. Đây là trường hợp thử nghiệm đầu tiên với khối
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 và sẽ chỉ ra tác động hiệu suất của việc sử dụng nó, nhưng không phát hiện bất kỳ ngoại lệ nào và sẽ phản ánh đường dẫn hạnh phúc của ứng dụng

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}

3. function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }1/function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2, không có ngoại lệ

Một khối

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2, nhưng nó không có bất kỳ trường hợp ngoại lệ nào đối với
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
9 hoặc
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2. Một trường hợp thử nghiệm khác với các khối
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2, nhưng mã tiếp tục vượt quá khối đó vì không có ngoại lệ nào được đưa ra

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2

4. function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }1/nhiều function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2, không có ngoại lệ

Tương tự như trường hợp thử nghiệm #3, nhưng sử dụng nhiều khối

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 xếp tầng

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
3

5. Ngoại lệ function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }1/function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2, function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2

Đây là bài kiểm tra đầu tiên mà

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 là một ngoại lệ. Điều này sẽ chỉ ra tác động hiệu suất của việc tạo đối tượng Ngoại lệ trái ngược với trường hợp #3

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
6

6. function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }1/nhiều function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2, ngoại lệ function case_try_successful_return(): ?int { try { return null; } catch(Exception $ex) {} }2

Một khối

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2, nhưng ngoại lệ bị bắt ở mệnh đề
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 cuối cùng. Trường hợp thử nghiệm này là để xem liệu có bất kỳ tác động hiệu suất đáng chú ý nào khi PHP đánh giá nhiều khối
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
8

môn thi

Các phiên bản PHP sau đây đã được thử nghiệm

  • 8. 0 thử nghiệm 3
  • 7. 4. 10
  • 7. 3. 22
  • 7. 2. 33

Kết quả kiểm tra

Phiên bản PHP nào được thêm xử lý ngoại lệ?

7. 27. 37. 48. 01. Không
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
20. 01160. 00850. 00700. 00602.
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2, trả lại trong vòng
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
260. 01590. 01200. 01000. 00803.
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2, không có ngoại lệ0. 01920. 01610. 01240. 00854. thử/bắt nhiều lần, không có ngoại lệ0. 02010. 01500. 01250. 00815.
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2,
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 ngoại lệ0. 10480. 07320. 05440. 05406.
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2, nhiều khối
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
20. 11020. 06800. 05610. 0550

Trên đây là thời gian thực hiện trung bình từ 5 lần chạy, với mỗi trường hợp được thực hiện 100 nghìn lần. Được làm tròn đến 4 chữ số thập phân và các giá trị thô có sẵn tại đây với tối đa 12 chữ số thập phân


Phần kết luận

Xuyên suốt tất cả các phiên bản PHP được thử nghiệm, bản thân các khối

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1/
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
2 có tác động hiệu suất tương đối nhỏ. Tuy nhiên, việc ném một Ngoại lệ, yêu cầu PHP thu thập dấu vết ngăn xếp và tạo một đối tượng Ngoại lệ có thể tốn kém và chậm tới 9 lần

Lưu ý rằng về số lượng tuyệt đối, ném ngoại lệ một triệu lần mất 0. 5 giây, điều này cho thấy rằng chi phí hiệu suất tuyệt đối để đưa ra một ngoại lệ là khá thấp và sẽ không gây tắc nghẽn trong bất kỳ ứng dụng nào

Các ngoại lệ có nghĩa là dành cho. tình huống đặc biệt. Sử dụng chúng để thay thế một chức năng ngữ nghĩa (chẳng hạn như một

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
27) có thể sai về mặt ngữ nghĩa, bởi vì một giá trị âm (chẳng hạn như
function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
28) vẫn là một kết quả mong đợi

Tuy nhiên, sử dụng Ngoại lệ như một cách để truyền đạt các tình huống đặc biệt mà mã trong ngữ cảnh không thể xử lý, sẽ là một ứng cử viên hoàn hảo để sử dụng Ngoại lệ

Trong PHP8. 0, một số chức năng nội bộ bắt đầu đưa ra Ngoại lệ, bao gồm cả ngoại lệ

function case_try_successful_return(): ?int {
    try {
        return null;
    }
    catch(Exception $ex) {}
}
1 mới. Vì vậy, bạn sử dụng Ngoại lệ khi cần thiết, bởi vì mặc dù chi phí tuyệt đối để ném một ngoại lệ cao hơn, nhưng nó hầu như không tạo ra sự khác biệt trong kế hoạch lớn của mọi thứ

Lợi ích của việc sử dụng Ngoại lệ đúng cách, chẳng hạn như trình xử lý ngoại lệ toàn cầu, khả năng tiếp tục ghi nhật ký và xử lý các ngoại lệ đã nói và kiến ​​trúc sạch hơn trong việc xử lý đường dẫn không hài lòng vượt xa chi phí hiệu năng của Ngoại lệ

Phiên bản nào xử lý ngoại lệ được giới thiệu trong PHP 1 điểm 4 3 2 5 và các phiên bản mới hơn?

Hỗ trợ ban đầu cho việc xử lý ngoại lệ đã được đưa vào ngôn ngữ này từ phiên bản 5 , với hai lớp ngoại lệ tích hợp sẵn đơn giản – Exception và ErrorException .

Làm cách nào để tăng ngoại lệ trong PHP?

Ném một ngoại lệ chung PHP gần như đơn giản như nó có vẻ. 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ó . Điều quan trọng nhất cần lưu ý là thông điệp.