捕获VA_LIST错误

catching va_list error

本文关键字:错误 LIST VA 捕获      更新时间:2023-10-16

我目前正在使用以下功能打印我的调试字符串:

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 wrongn");
    }
}

我会收到" eDitor.exe.exe"中的"无人手法"。这是完全可以理解的,但是我想知道如何将其封装在可能的尝试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传递va_start的参考args是C 中的不确定行为。这意味着您无法预测编译器会做什么。即使在此编译器中使用某些东西,它也可能无法在另一个编译器上使用。它甚至可能在下一个版本的同一编译器上都无法使用。

也就是说,可能有特定平台的构造可以帮助您引起例外。例如。在Windows上,您应该能够使用_ try/ _Except来捕获异常。但是请注意,这是不确定的行为 - 即使在此版本的编译器中起作用,在下一个版本中,va_start可能会决定做完全不同的事情,这可能导致其他错误&不是可以在__try/__except

中捕获的崩溃
相关文章: