c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

throw しない函數が吐く console.error を補足する

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:
    # ...