[英]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.