2013-07-16 8 views
30

Wyjątki/Błędy w wielu innych językach programowania (np. Java, ruby) zawsze dostarczają informacje o stosie/śledzeniu.Kiedy będą wyświetlane właściwe ślady stosu w funkcji window.onError?

W języku JavaScript nieobsługiwane Błędy są przechwytywane przez window.onError.

Mimo że funkcja ta nie otrzymuje obiektu Error, nie mamy dostępu do właściwości stosu obiektu.

Czy istnieje jakieś wiarygodne źródło informacji o , gdy czy będą na to jakieś zmiany?

+0

nadzieją nigdy, że jest to poważny problem zabezpieczeń. – dandavis

+4

@dandavis, w jaki sposób byłby to problem z bezpieczeństwem? użytkownik może przejść do kodu javascript za pomocą narzędzi przeglądarki przez cały dzień. przy dostatecznym wysiłku mogliby uzyskać ślad stosu – Kip

+0

, ponieważ gdyby zgłoszono pełne błędy, można załadować dowolną stronę HTML jako skrypt [src], a komunikat o błędzie rozkoszowałby się zawartością HTML w komunikacie o błędzie składni, naruszając SOP. – dandavis

Odpowiedz

10

Wygląda na to, że sam obiekt błędu będzie piątym parametrem dostarczanym do onerror. http://html5.org/tools/web-apps-tracker?from=8085&to=8086
http://www.whatwg.org/specs/web-apps/current-work/ - sekcja 7.1.6.1

+1

To nie jest prawda we wszystkich przeglądarkach. IE10 zwraca args jako errorMessage, scriptFile, numerListości skryptu, numer kolumny skryptowej – Kip

+1

Według [http://msdn.microsoft.com/en-us/library/ie/cc197053.aspx](http://msdn.microsoft.com/en- us/library/ie/cc197053.aspx) (ostatnia aktualizacja 22.02.2013) to, co mówisz, nie jest prawdą. Czy możesz podać część dokumentacji, która tak mówi? –

+1

Dokumentacja nie mówi, że istnieje czwarty argument. ale jeśli faktycznie spróbujesz (po prostu spróbuj, próbowałem wczoraj), zobaczysz czwarty argument to numer kolumny. może to być nieudokumentowana "funkcja", która nie jest zgodna ze standardami, ale z pewnością nie zwraca pierwotnego obiektu błędu. – Kip

34

Obiekt błędu, które zawierają „oczyszczone” ślad stosu, są obecnie przekazywane jako piąty parametr onerror w Chrome. Możesz przeczytać o tym tutaj: https://code.google.com/p/chromium/issues/detail?id=147127

W chwili pisania tego tekstu jest na Wyspach Kanaryjskich i powinno zostać wypchnięte do stabilnego wydania Chrome jeszcze w tym miesiącu. Jeśli używasz Canary można przetestować ją tak:

window.onerror = function (message, file, line, column, errorObj) { 
    if(errorObj !== undefined) //so it won't blow up in the rest of the browsers 
     console.log('Error: ' + errorObj.stack); 
} 

Widać jak na spec że już one również dodanej numer kolumny, które IE 10 ma również zastosowanie.

Można również kasy dyskusję Mozilla: https://bugzilla.mozilla.org/show_bug.cgi?id=355430

+0

Wydaje się również działać w firefoxie, używając v34.0.5. –