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 确认下吧