アカウント名:
パスワード:
「オプションの診断データを送信する」をオフにすれば収まるって事はユーザの行動情報収集用の処理でホストアプリを巻き込んで落ちてる訳か。余計なことの為になんてことを。
Embarcadero Technologiesの説明見た感じ、Windowsのコンポーネントが想定外の挙動してVCLのコンポーネントが処理できず例外吐いてそんなの想定してないアプリがcatchしてなくて死ぬみたいな流れかなあ。
ライブラリが元々投げることになっている例外はすべて掴むべき。絵投げてきた理由が間違ってる?知らん。
Win32 APIはそう簡単に例外投げない。出るのはNULLとHRESULTと不具合。
C言語(C++ではない)向けのインターフェースなんだから例外を投げるわけがない。
WindowsはOSレベルで構造化例外処理 [microsoft.com]をサポートしてるエラーの時に例外を投げるよう指示できるAPIもある
例メモリ割り当て方法の比較 [microsoft.com]
GlobalAlloc、LocalAlloc、HeapAlloc 関数は最終的に同じヒープからメモリを割り当てますが、それぞれ少し異なる機能セットを提供します。 たとえば、メモリを割り当てられなかった場合に例外を発生するように HeapAlloc に指示できます。
付け足し。たとえば、Cであっても、アプリケーション設計をひとつしくじれば、ぬるぽとかいくらでも起こる。SEGVってやつだが、これはSEHで通知されてくる。キャッチしなければ落ちる。Win32は、SEHではなく、エラーコードかNULLで失敗を通知してくる。これでは、catch()でエラーを拾いきるって手口が向かないってこと。
> Win32は、SEHではなく、エラーコードかNULLで失敗を通知してくる。
それにはたぶん1. (タテマエ上)VC++以外のコンパイラーもサポートする必要がある。実際にMinGWはSEHサポートしていなかったような2. Win16とある程度のソース互換を取る必要がある(HeapAllocはWin32の新API)みたいな要因があると思う。
というか例外の実装って処理系によってけっこう違うから、OSをどのような言語で書こうがプロセス側で例外を受け取るのは難しい。JavaVMや.NETランタイム内とかだと例外の実装も決められてるので言語をまたいで扱えるけどね。
例外といっても、
(A) CPUのハードウェア割り込みの処理 CPUやカーネルに依存(B) CPUのソフトウェア割り込みの処理 CPUやカーネルに依存(C) 言語・処理系で実装された処理 CPUやカーネルには依存しない。(ただし高速化のために、処理系の中でCPUのソフトウェア割り込みを利用して実装している場合もある)
と、さまざまな「例外」がある。これらは区別して議論すべき
たとえば> C言語(C++ではない)向けのインターフェースなんだから例外を投げるわけがない。これは間違い
(A)(B)は投げることがある.「C言語は(C)をサポートしてないから、C言語向けのインタフェースは(C)を投げるわけがない」というべき
> WindowsはOSレベルで構造化例外処理 [microsoft.com]をサポートしてる
これは「Windowの(A)(B)(C)は、Windowsが用意しているAPIで制御できます(そりゃそうだWindows専用なんだから)」という話。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
余計な事をしたんだろうな (スコア:1)
「オプションの診断データを送信する」をオフにすれば収まるって事はユーザの行動情報収集用の処理でホストアプリを巻き込んで落ちてる訳か。
余計なことの為になんてことを。
Re: (スコア:1)
Embarcadero Technologiesの説明見た感じ、Windowsのコンポーネントが想定外の挙動してVCLのコンポーネントが処理できず例外吐いて
そんなの想定してないアプリがcatchしてなくて死ぬみたいな流れかなあ。
Re: (スコア:0)
ライブラリが元々投げることになっている例外はすべて掴むべき。絵投げてきた理由が間違ってる?知らん。
Re: (スコア:0)
Win32 APIはそう簡単に例外投げない。出るのはNULLとHRESULTと不具合。
Re: (スコア:0)
C言語(C++ではない)向けのインターフェースなんだから例外を投げるわけがない。
Re: (スコア:1)
WindowsはOSレベルで構造化例外処理 [microsoft.com]をサポートしてる
エラーの時に例外を投げるよう指示できるAPIもある
例
メモリ割り当て方法の比較 [microsoft.com]
GlobalAlloc、LocalAlloc、HeapAlloc 関数は最終的に同じヒープからメモリを割り当てますが、それぞれ少し異なる機能セットを提供します。 たとえば、メモリを割り当てられなかった場合に例外を発生するように HeapAlloc に指示できます。
Re: (スコア:0)
付け足し。たとえば、Cであっても、アプリケーション設計をひとつしくじれば、ぬるぽとかいくらでも起こる。
SEGVってやつだが、これはSEHで通知されてくる。キャッチしなければ落ちる。
Win32は、SEHではなく、エラーコードかNULLで失敗を通知してくる。
これでは、catch()でエラーを拾いきるって手口が向かないってこと。
Re: (スコア:0)
> Win32は、SEHではなく、エラーコードかNULLで失敗を通知してくる。
それにはたぶん
1. (タテマエ上)VC++以外のコンパイラーもサポートする必要がある。実際にMinGWはSEHサポートしていなかったような
2. Win16とある程度のソース互換を取る必要がある(HeapAllocはWin32の新API)
みたいな要因があると思う。
Re: (スコア:0)
というか例外の実装って処理系によってけっこう違うから、OSをどのような言語で書こうがプロセス側で例外を受け取るのは難しい。JavaVMや.NETランタイム内とかだと例外の実装も決められてるので言語をまたいで扱えるけどね。
Re: (スコア:0)
例外といっても、
(A) CPUのハードウェア割り込みの処理 CPUやカーネルに依存
(B) CPUのソフトウェア割り込みの処理 CPUやカーネルに依存
(C) 言語・処理系で実装された処理 CPUやカーネルには依存しない。(ただし高速化のために、処理系の中でCPUのソフトウェア割り込みを利用して実装している場合もある)
と、さまざまな「例外」がある。これらは区別して議論すべき
たとえば
> C言語(C++ではない)向けのインターフェースなんだから例外を投げるわけがない。
これは間違い
(A)(B)は投げることがある.「C言語は(C)をサポートしてないから、C言語向けのインタフェースは(C)を投げるわけがない」というべき
> WindowsはOSレベルで構造化例外処理 [microsoft.com]をサポートしてる
これは「Windowの(A)(B)(C)は、Windowsが用意しているAPIで制御できます(そりゃそうだWindows専用なんだから)」という話。