Trả lời

10

Khi bạn đang sử dụng các hằng số, trình thông dịch cố gắng tính toán trước kết quả và không thành công với phép chia bằng lỗi số không. Mã của bạn thậm chí không được thực thi vì vậy không có gì để bẫy.

Bạn có thể xác minh điều này cho chính mình bằng cách thay đổi mã của bạn để sử dụng các biến, buộc nó phải được thực thi.

try { 
    $divisor = 0 
    [int]$a = 1/$divisor 
} 
catch { 
    write 1 
} 
finally { 
    write 2 
} 

Từ Windows PowerShell trong hành động (p.257)

Ví dụ dưới đây sử dụng 1/$ null. Lý do để làm điều này thay vì chỉ đơn giản là 1/0 là bởi vì trình thông dịch PowerShell thực hiện điều gì đó gọi là xếp biểu thức liên tục.

Nó xem xét các biểu thức chỉ chứa giá trị không đổi. Khi nó thấy một, nó đánh giá biểu thức đó một lần tại thời gian biên dịch sao cho nó không phải lãng phí thời gian thực hiện lại nó khi chạy.

Điều này có nghĩa là các biểu thức không thể, chẳng hạn như chia cho số không, được phát hiện và xử lý như lỗi phân tích cú pháp. Không thể thu thập lỗi phân tích cú pháp và không được ghi lại khi chúng được nhập tương tác, do đó, chúng không tạo một ví dụ điển hình. (Nếu một kịch bản gọi kịch bản khác và rằng kịch bản có một trong các lỗi này, kịch bản gọi điện thoại có thể bắt nó, nhưng kịch bản đang được phân tích có thể không.)

1

Bạn có thể thử để ném một ngoại lệ với loại đường: trap { "Your Exception" } 1/0
này sẽ ném ngoại lệ "chia cho 0". Mặc dù tôi không thực sự hiểu tại sao mã của bạn không ném ngoại lệ ._.
PS: Đó có phải là catch [System.SystemException] không? :)

4

RuntimeException trong v2 không catchable. Nó đã được sửa trong v3.

Chia cho 0 sẽ rơi vào danh mục này.

+0

+1 - Bạn có tham chiếu về điều này không? –

+1

Vì vậy ... xấu của tôi. :) Nó không phải là RuntimeException. Tôi vừa sao chép qua FullyQualifiedErrorId và không chứa chi tiết quan trọng cho kịch bản đó. Về v3: Tôi không thể tìm thấy bất kỳ tham chiếu nào (chưa). Doug Finke đã đề cập đến tính toán này như là ví dụ trong cuốn sách sắp tới của ông, "PowerShell for Developers", vì vậy tôi đã cố gắng và nhận ra rằng trong v3 nó thực sự * có thể * bị bắt. Xin lỗi vì bất kỳ sự nhầm lẫn nào do sử dụng thuật ngữ sai ... :) – BartekB

+0

Thx để cập nhật. Nếu bạn tìm thấy một tài liệu tham khảo, tôi hy vọng bạn vẫn sẽ đăng nó ở đây. –

Các vấn đề liên quan