error が有るのにそれを console に吐くだけで throw しない不屆きな函數が有る。壊れた data で處理が進んでは困るから throw して貰ひたい。或いは error を UI 上に表示したいから catch したい。詰まり console に吐かれた error を捕捉して何かを行なひたい。Selenium 等 ChromeDriver であれば正にさう云ふ、console に吐かれたものを一覧する API が有る (Selenium は Web browser 上の error を catch 出來ないから必要だ)。puppeteer にも同樣の API が有る事だらう。しかし DOM にそんな API は無い。
幸い Web browser の global な環境は thread 間で切り離されてゐて、single thread に近く考へられる。それとconsole.error
は有り難い事に writable だ。目當ての函數を實行する間だけ、throw する函數として上書きする。
const original_console_error = console.error console.error = function (error) { throw error; }; try { some_ill_mannered_function() catch (error) { // ... } finally { console.error = original_console_error }
例へばこう成るだらう。もっと色んな處理を詰めても好い。
catch されてゐない全ての error を捕まへる事が目的なら、window の error event と unhandledrejection event とを捕まへれば好い。DOM 要素で起きて bubble up して來ない error はこれでも捕まへられないし、worker はまた別だ。
Transcrypt (Python) のものも書いたから載せておく。
class CaptureConsoleError(object): """Capture console errors. This is useful for ill-mannerd modules which dosen't throw errors and only output it to console. """ def __init__(self): """Init.""" self.original = console.error self.reported_errors = [] def __enter__(self): """Enter to a with.""" console.error = self.__draw_error def __exit__(self): """Exit from a with.""" console.error = self.original if len(self.reported_errors) > 0: raise Exception("\n".join(map(str, self.reported_errors))) def __draw_error(self, error): self.reported_errors.append(error)
次のやうにして使ふ。
try: with CaptureConsoleError(): some_ill_mannered_function() except Exception as error: # ...