Máy ảo của các ngôn ngữ như Java (JVM) hiện thực cơ chế try/catch bằng một bảng ngoại lệ (exception table) gắn với mỗi hàm, thay vì kiểm tra điều kiện tường minh trong bytecode: mỗi mục của bảng mô tả một khoảng địa chỉ lệnh được bảo vệ, cùng với kiểu ngoại lệ mà nó bắt và địa chỉ của trình xử lý (handler).
Cho bảng ngoại lệ gồm m mục, mục thứ i là bộ bốn (starti,endi,handleri,typei) nghĩa là: nếu tại lệnh có địa chỉ pc thoả starti≤pc<endi, một ngoại lệ kiểu typei được ném ra, thì điều khiển sẽ chuyển tới địa chỉ handleri. Ký hiệu kiểu đặc biệt * khớp với bất kỳ kiểu ngoại lệ nào (dùng cho khối bắt mọi lỗi / finally).
Khi nhiều mục cùng khớp với một truy vấn (pc,type) (nghĩa là pc nằm trong khoảng của mục đó và kiểu khớp — hoặc mục có typei= *, hoặc typei trùng đúng type), quy tắc của JVM là chọn mục xuất hiện đầu tiên theo thứ tự khai báo trong bảng (không phải mục có khoảng hẹp nhất).
Với mỗi truy vấn (pc,type) độc lập (không mô phỏng cả một luồng thực thi, chỉ tra cứu bảng ứng với một sự kiện ném ngoại lệ tại địa chỉ đó), hãy in ra địa chỉ handler được chọn, hoặc UNCAUGHT nếu không mục nào khớp.
Ví dụ: bảng gồm mục (5,15,60,ValueError) rồi mục (0,20,50,*); truy vấn (6,ValueError) khớp cả hai mục nhưng chọn mục khai báo trước, cho kết quả handler 60.
start end handler type cách nhau bởi khoảng trắng (start,end,handler là số nguyên không âm, start<end; type là một chuỗi không chứa khoảng trắng, có thể là *).pc type cách nhau bởi khoảng trắng (pc là số nguyên không âm, type là chuỗi không chứa khoảng trắng, khác *).In ra q dòng, mỗi dòng ứng với một truy vấn theo đúng thứ tự vào: địa chỉ handler (số nguyên) nếu tìm thấy mục khớp đầu tiên, hoặc chuỗi UNCAUGHT nếu không có mục nào khớp.
Ví dụ:
Đầu vào:
1
0 10 100 IOError
2
5 IOError
5 ValueError
Đầu ra:
100
UNCAUGHT
Đầu vào:
3
5 15 60 ValueError
10 12 70 TypeError
0 20 50 *
4
6 ValueError
11 TypeError
3 TypeError
25 AnyError
Đầu ra:
60
70
50
UNCAUGHT
Đang tải editor...