2009-01-17 36 views

Trả lời

10

Có một cách, mặc dù đắt hơn: ném một ngoại lệ, bắt nó ngay lập tức và tìm ra mục nhập đầu tiên từ dấu vết ngăn xếp của nó. Xem ví dụ here về cách phân tích dấu vết. Thủ thuật tương tự cũng có thể được sử dụng trong Java thuần túy (nếu mã được biên dịch với thông tin gỡ lỗi được bật).

Chỉnh sửa: Rõ ràng không phải tất cả các trình duyệt đều hỗ trợ điều này. Tin tốt là (cảm ơn cho bình luận, Christoph!) Rằng một số trình duyệt xuất tên tập tin nguồn và số dòng directly through the fileName and lineNumber properties of the error object.

+2

trình duyệt mà thêm một vết đống lỗi đối tượng cũng có thể phơi bày một 'tài sản lineNumber' trực tiếp - không cần phân tích có ... – Christoph

6

Câu trả lời ngắn gọn là không.

Câu trả lời dài là tùy thuộc vào trình duyệt của bạn, bạn có thể ném & bắt ngoại lệ và kéo theo dõi ngăn xếp.

Tôi nghi ngờ bạn đang sử dụng tính năng này để gỡ lỗi (tôi hy vọng vậy, dù sao!) Vì vậy, đặt cược tốt nhất của bạn sẽ là sử dụng Firebug. Điều này sẽ cung cấp cho bạn một đối tượng console; bạn có thể gọi console.trace() tại bất kỳ thời điểm nào để xem chương trình của bạn đang làm gì mà không vi phạm thực thi.

0

Có một giải pháp thay thế.

Thông thường __ LINE __ kết hợp với __ FILE __ được sử dụng để đánh dấu vị trí trong mã và đánh dấu được thực hiện để tìm vị trí đó sau này.

Tuy nhiên, có thể đạt được hiệu quả tương tự bằng cách sử dụng Số nhận dạng duy nhất toàn cầu (GUID-s) thay cho __ LINE __ và __ FILE __. Chi tiết của giải pháp nằm trong COMMENTS.txt của bộ công cụ được cấp phép BSD tự động hóa quy trình.

+1

Tôi không hiểu ... có thể giúp bạn giải thích? – Jason

3

A __LINE__ trong C được mở rộng bởi preprocessor theo nghĩa đen sẽ thay thế bằng số dòng của đầu vào hiện tại. Vì vậy, khi bạn nhìn thấy

printf("Line Number: %d\r\n", __LINE__); 

trình biên dịch thấy:

printf("Line Number: %d\r\n", 324); 

Trong thực tế số (324 trong trường hợp này) được mã hóa cứng vào chương trình. Chỉ có cơ chế hai mặt có thể thực hiện điều này.

Tôi không biết PHP đạt được điều này như thế nào (nó có được xử lý trước không?).

+3

Có, PHP đã được xử lý trước. Trong thực tế, nó là một từ viết tắt đệ quy: PHP -> PHP: Hypertext Preprocessor. Từ viết tắt ban đầu là dành cho * Trang chủ cá nhân *. – alex

2

Bạn có thể thử chạy bộ tiền xử lý C (f.e. cpp từ Bộ sưu tập GNU Compiler) trên tệp javascript của bạn - động với mỗi yêu cầu hoặc tĩnh, bằng cách thực hiện thao tác này mỗi lần bạn thay đổi tệp javascript. Tôi nghĩ rằng cú pháp javascript là tương tự đủ để làm việc này.

Sau đó, bạn sẽ có tất cả sức mạnh của bộ tiền xử lý C.

0

Tôi nghĩ rằng tiền xử lý có ý nghĩa hơn, ở chỗ nó không thêm chi phí thời gian chạy. Cách thay thế cho bộ tiền xử lý C đang sử dụng perl, như trong quy trình 2 bước bên dưới:

1 - thêm “Dòng # 999 \ n” vào mỗi dòng trong tập lệnh mà bạn muốn đánh số, ví dụ:,

alert ("Line # 999 \n"+request.responseText); 

2 – run the perl below: 

cat my_js.js | perl -ane "{ s/Line # \d+ /Line # $. /; print $_;}" > C_my_js.js; mv C_my_js.js my_js.js 
Các vấn đề liên quan