簡體   English   中英

捕獲va_list錯誤

[英]catching va_list error

我目前正在使用以下功能來打印調試字符串:

void Script::OutputDebugStringN(const char *format, ...)
{
    char outstring[256];
    memset(outstring, 0, sizeof(outstring));

    try
    {
        va_list args = {0};
        va_start(args, format); //args = (va_list) (&format+1);

        vsprintf(outstring, format, args);

        va_end(args);

        OutputDebugString(outstring);
    }
    catch (...) //most likely reference val arg error (va_list doesn't support ref args)
    {
        OutputDebugString("[OutputDebugStringN] Something went wrong\n");
    }
}

每次我發送參考值參數時,都會收到“在Editor.exe中發生類型為'System.AccessViolationException'的未處理的異常”錯誤消息; 這是完全可以理解的,但是我想知道如何將其封裝在可能的try catch語句中,以防止錯誤關閉整個程序。 (以上無效)

我目前正在從我的C#編輯器中調用一個自制的c ++ dll(具有上述功能)。

這是c#代碼:

private void ComponentDispatcher_ThreadIdle(object sender, EventArgs e)
    {
        //render display window (if something is not blocking it)
        if (renderViewHost.Update)
        {
            try { NativeMethods.UpdateRenderWindow(); }
            catch (Exception exc)
            { Debug.WriteLine("[ThreadIdle::UpdateRenderWindow] Exception caught: {0}" + exc); }
        }
    }

我只是發現打印出調試字符串的函數本身有錯誤是無法接受的。 有任何想法嗎? 歡迎對錯誤代碼/觀察的所有評論。

根據C ++標准,使用va_start傳遞參考args是C ++中未定義的行為。 這意味着您無法預測編譯器將執行的操作。 即使某些內容在此編譯器中起作用,也可能無法在其他編譯器上起作用。 它可能甚至無法在同一編譯器的下一版本上運行。

也就是說,可能存在特定於平台的構造可以幫助您引發異常。 例如。 在Windows上,您應該可以使用_ try / _except捕獲異常。 但請注意,這是未定義的行為-即使它在此版本的編譯器中有效,在下一個版本中,va_start可能會決定執行完全不同的操作,這可能會導致其他錯誤並且不會導致__try/__except

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM