ホームページ > バックエンド開発 > C++ > 標準 C# try...catch ブロックはアンマネージ ライブラリからのネイティブ例外を処理できますか?

標準 C# try...catch ブロックはアンマネージ ライブラリからのネイティブ例外を処理できますか?

Barbara Streisand
リリース: 2025-01-03 02:41:38
オリジナル
759 人が閲覧しました

Can Standard C# try...catch Blocks Handle Native Exceptions from Unmanaged Libraries?

C# ではネイティブ例外回避が発生しますか?

C# で外部のアンマネージ ライブラリを操作する場合、次のような問題が発生する可能性を考慮することが重要です。これらのライブラリの奥深くから発生するネイティブ例外。

標準化可能Try...Catch Capture Native Exceptions?

幸いなことに、C# にはネイティブ例外をキャッチするメカニズムも用意されています。質問: 標準の try...catch ブロックは、これらのアンマネージ例外を変更せずに処理できますか?

答え: ネイティブ例外のキャッチ

ネイティブ例外をキャッチするには、次のことができます。 Win32Exception クラスを使用します。これには、エラー コードを調べて特定のケースに応じて処理できる NativeErrorCode という名前のプロパティが用意されています。

たとえば、次のコード スニペットを考えてみましょう。

const int ERROR_FILE_NOT_FOUND = 2;
const int ERROR_ACCESS_DENIED = 5;
const int ERROR_NO_APP_ASSOCIATED = 1155;

void OpenFile(string filePath)
{
    Process process = new Process();

    try
    {
        // Calls native application registered for the file type
        // This may throw a native exception
        process.StartInfo.FileName = filePath;
        process.StartInfo.Verb = "Open";
        process.StartInfo.CreateNoWindow = true;
        process.Start();
    }
    catch (Win32Exception e)
    {
        if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND ||
            e.NativeErrorCode == ERROR_ACCESS_DENIED ||
            e.NativeErrorCode == ERROR_NO_APP_ASSOCIATED)
        {
            MessageBox.Show(this, e.Message, "Error",
                MessageBoxButtons.OK,
                MessageBoxIcon.Exclamation);
        }
    }
}
ログイン後にコピー

この例では、次のことを試みます。特定のファイルタイプに関連付けられたネイティブアプリケーションを起動します。アプリケーションを開始できない場合は、関連するエラー コードとともに Win32Exception がスローされます。 catch ブロック内の if ステートメントは、特定のエラー コードをチェックし、適切なメッセージを表示します。

以上が標準 C# try...catch ブロックはアンマネージ ライブラリからのネイティブ例外を処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート