C++ try,catch与野指针的问题

问题相关代码,请勿粘贴截图
for(Mod mod : mh.mods){
        al("Mod " + mod.path);
        mod.info = mod.GMI(basicInfo);
            al("Mod " + mod.info.name);//Log输出,debug时会输出至控制台
    }
运行结果及报错内容

最后程序以各种乱码输出并崩溃,但中规中矩都是0xC0000005

我的解答思路和尝试过的方法

由于这个报错是我有意而为之,我当然知道问题在哪里。那就是GMI(xx)没有返回值,导致出现了野指针(有时又是空指针)【即mod.info.name.c_str()不是一个有效的地址】,于是我便用了try&catch

  try{
            al("Mod " + mod.info.name + " " + mod.path + ":\nAuthor:" + mod.info.author + "\nDescription:" + mod.info.Description + "\n");
        }catch(exception&){
            mod.info = ModInfo();
            al("Mod " + mod.path + " returns a bad value when get the info!");
        }
    }

报错是不报错了,但是程序并不输出异常处理的IO行,反而继续输出异常出现的地方,只不过这次输出为空:

[2022-08-29 13:22:20]:1098.828700ms:Mod  C:\Users\yd\AppData\Roaming\StudyAll\UnlimitedLife\Mods\ULSimpleMod.dll:
Author:
Description:
我想要达到的结果

我想要代码执行catch中的内容

好吧,最后只能让我放弃try&catch了,我选择在结构体(类)里添加一个bool属性,叫做isObjVaild,c++构造时默认值为false,那么要想让isObjValid为true,则GMI必须返回值,因此来判断并处理这种较为极端的状况。(当然,如果在DLL函数里面强行让string的data()指向异常地址并返回还是不可避免的)

不是你这么玩的,之所以出现catch?是因为你的执行体中出现了exception 并且抛出了
按照你的预计,mod.info 为NULL 会抛出,但是,你。。。。mod.info 是有值的,不是NULL。
怎么抛?
还是回归到GMI 确认下吧

看下这篇博客,也许你就懂了,链接:C++ 异常处理(try catch)
同时,你还可以查看手册:c++-try-catch 块 中的内容