Câu trả lời:
Trong một lúc, hãy đi qua Stack Overflow - Các ngoại lệ Java chậm đến mức nào?
Nó chỉ ra rằng phần đắt tiền của việc ném ngoại lệ là dân số của dấu vết ngăn xếp đi kèm với ngoại lệ.
Theo dõi ngăn xếp này rất hữu ích khi gỡ lỗi các vấn đề để cố gắng tìm ra nơi mà mọi thứ được gọi từ đâu. Một trong những câu hỏi tiêu chuẩn được hỏi về các vấn đề là "mã là gì" và "dấu vết ngăn xếp là gì". Không có hai điều đó, việc chẩn đoán một vấn đề là không thể.
Tuy nhiên, không phải tất cả các ngoại lệ được tạo ra bởi các vấn đề . Một số trong số họ, bạn gần như mong đợi.
Hãy xem xét tình huống bạn đã có một Chuỗi từ một số nguồn và bạn muốn đưa nó trở lại định dạng số nguyên với Integer.decode .
Integer foo = Integer.decode(str);
Nhưng điều đó decode
ném một kiểm tra NumberFormatException
. Đồng ý...
Integer foo;
try {
foo = Integer.decode(str);
} catch (NumberFromatException e) {
// raise an error back to the input form
}
Nhưng bạn thực sự không quan tâm đến dấu vết ngăn xếp ở đó ... nhưng nó ở đó. Và chỉ chậm hơn một chút vì nó điền vào dấu vết ngăn xếp.
Do đó, ở Scala, bạn đã có NoStackTrace
:
Một đặc điểm cho các trường hợp ngoại lệ, vì lý do hiệu quả, không điền vào dấu vết ngăn xếp. Ngăn chặn theo dõi ngăn xếp có thể bị vô hiệu hóa trên cơ sở toàn cầu thông qua trình bao bọc thuộc tính hệ thống trong scala.sys.SystemProperIES.
Đừng điền vào những gì bạn không cần. Bạn không quan tâm đến dấu vết ngăn xếp bởi vì bạn đang xử lý nó ngay tại đó và sau đó. Đây không phải là một cái gì đó đang được thông qua, và nó cũng không phải là tất cả.
Nó không phải là thực hành xấu để sử dụng nó khi bạn biết những gì bạn đang xử lý. Nhưng, nếu bạn chuyển cái này lên chuỗi - không sử dụng nó - bạn có thể chỉ cần đăng nhập nơi có một ngoại lệ.