2013-09-04 49 views
15

Để tắt phần nhận xét dài về "không sử dụng chức năng mới" và/hoặc "eval là điều xấu", câu hỏi này là về cách truy cập, nếu có thể, thông tin lỗi có liên quan đến một hàm tạo new Function() không thành công. Đó chủ yếu là một câu hỏi để khám phá một giới hạn trong những gì trình duyệt sẽ cho phép tôi làm khi cố gắng khai thác JavaScript đến mức mà việc triển khai trình duyệt thông thường và đặc tả cho phép. Vì vậy, với tuyên bố miễn trừ đó tại chỗ:Tìm nơi xảy ra lỗi cú pháp khi hàm mới() không thành công

Khi đánh giá mã thông qua một cuộc gọi Function() mới, có cách nào để tìm ra lỗi hàm cú pháp trong nội dung của hàm không, nếu mã cú pháp bất hợp pháp đang được đánh giá? tức là:

try { 
    var generator = new Function(input); 
    try { 
    generator(); 
    } 
    catch (runtimeError) { 
    console.error("legal code; unforeseen result: ", runtimeError); 
    } 
} 
catch (syntaxError) { 
    console.error("illegal code; syntax errors: ", syntaxError); 
} 

Khi xây dựng trình tạo không thành công, có cách nào để tìm ra (từ trình duyệt, không sử dụng jslint hoặc thư viện bên ngoài khác) lỗi đó xảy ra hay không?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype đề cập rằng một Lỗi Cú pháp có một tài sản filenamelinenumber, nhưng đây là những không xác định cho mã động đánh giá thông qua một chức năng mới() constructor từ những gì tôi có thể nói, vì vậy dựa trên đối tượng lỗi chính nó có vẻ không phải là một lựa chọn . Có cách nào khác để giới thiệu mã cho trình duyệt để mã, khi chúng ta biết nó có lỗi cú pháp từ một cuộc gọi hàm mới không thành công, có thể được sử dụng để tìm ra vấn đề ở đâu theo công cụ JS được sử dụng?

(Tất nhiên, nếu mục tiêu chỉ đơn giản là tìm lỗi cú pháp, thì jslint làm bước tiền xử lý sẽ là giải pháp truy cập, nhưng tôi quan tâm hơn đến việc liệu trình duyệt có thể báo cáo theo cách nào đó hay không thông tin này, ngay cả khi ở dạng giới hạn như "có MỘT SỐ lỗi trên dòng/char ...")

Trả lời

4

afaik không thể tìm ra nơi nó xảy ra. nhưng bạn có thể muốn xem Exception.message để tìm thông tin lỗi là gì.

dụ: http://jsbin.com/IRoDiJIV/1/watch?js

+0

Tôi đã tìm thấy giải pháp, nhưng không xem xét việc bắt lỗi khi chạy mã, đó là một bổ sung hữu ích. –

+0

Ví dụ đó là một ngoại lệ thời gian chạy (cụ thể là một Tham chiếu), không phải là một Cú pháp Cú pháp! Btw, ví dụ của bạn thực sự ghi lại nơi xảy ra lỗi: 'Lỗi được ném ở dòng 1, cột 0 trong (): callundefinedFunction(); được gọi từ dòng 18, cột 4 trong () trong http://run.jsbin.com/runner: generator(); được gọi từ dòng 11, cột 7 trong http://run.jsbin.com/runner: (function() {' – Bergi

+0

nó đã làm gì? bạn đã sử dụng thuộc tính/phương pháp nào trên Lỗi? không thể tìm thấy thông tin nào trong docu hoặc trong ví dụ (chạy trong chrome) – floww

1

Tìm thấy một giải pháp bản thân mình bằng cách sử dụng phương pháp simiar để setting breakpoints in evaled code

Trong bảng điều khiển nguồn chrome công cụ dev, tôi đặt sau đây trong một breakpoint có điều kiện trên dòng new Function (vì nó là mã thư viện và Tôi không thể thay đổi nó.)

(function(eval_js, load_js) { 
    try { 
    eval(eval_js); 
    } catch (e) { 
    (function addCode(js) { 
     var e = document.createElement('script'); 
     e.type = 'text/javascript'; 
     e.src = 'data:text/javascript;charset=utf-8,' + escape(js); 
     document.body.appendChild(e); 
     console.warn("Inserted Script for ", js); 
    })(load_js.replace(/;/g,";\n")); 
    handlerCode = ""; 
    return false; 
    } 
    return false; 
})("new Function('event', handlerCode)", handlerCode) 
+0

Làm thế nào để bạn nhận được lỗi của lỗi cú pháp trong' eval_js' từ đó? – Bergi

+0

@Bergi , nó sẽ tải mã handler_js qua một uri dữ liệu trong phần tử script mới, khi chạy sẽ đưa ra lỗi trong bảng điều khiển mà bạn có thể gỡ lỗi trong công cụ chrome dev và firebug –

+1

Nhưng có thể truy cập lỗi đó theo lập trình mà không cần bất kỳ Đó là những gì OP muốn làm – Bergi