未处理的异常错误
Unhandled exception error
我调用cplex来解决visual studio中的优化问题。我的问题很简单:
IloNumVarArray a(env,N,0,IloInfinity);
IloNumVarArray d(env,N,0,IloInfinity);
IloModel Model(env);
//objective function
IloExpr obj(env);
for(IloInt n=0; n<N;n++)
obj+=a[n]*c1[n]-d[n]*c2[n];
Model.add(IloMinimize(env,obj));
obj.end();
for(IloInt n=0;n<N;n++){
Model.add(a[n]==0);
Model.add(d[n]==0);
}
IloCplex cplex_p(Model);
cplex_p.setParam(IloCplex::EpGap,0.0001);
cplex_p.solve();
cplex_p.end();
Model.end();
但每次它都会给我这个错误信息:
Unhandled exception at 0x74eeb9bc in For-Calling-Cplex.exe: Microsoft C++ exception: IloWrongUsage at memory location 0x0027fbe4..
我做错了什么?
使用结束函数为时过早。
obj.end();
由于您将其作为目标函数添加到模型中。除非您正在迭代创建模型并且内存不足,否则不应该真正调用.end()函数。
如果使用msvc,则应在调试模式下进行编译,并设置一个断点,使调试器在实际引发异常时停止。接下来,您应该始终在高级别捕获IloException。在try/catch块中编写函数调用
try {
buildModel():
} catch (const IloException& e)
{
cerr << e;
throw; // if you like
}
根据C++规则,如果程序抛出未被捕获的异常,则程序将立即终止(通过std::terminate()
)。在这种情况下,我们可以看到运行时在终止时打印异常的名称(IloWrongUsage
)。
为了获得有关问题原因的更多详细信息,您应该将代码封装在异常处理程序中,并检查异常所携带的信息
例如:
int main(int, char*[])
{
try
{
// your code goes here
}
catch ( IloException& e )
{
// based on the ILOG CPLEX 10.0 User’s Manual / Languages and APIs / Handling Errors
std::cout << e << std::endl;
e.end();
}
catch ( ... )
{
std::cout << "Unknown exceptionn";
}
}
之后,您将(可能)看到异常的详细信息。谷歌搜索显示IloWrongUsage
意味着某些参数是错误的或类似的(我不知道cplex是什么)。
UPD我在网上找到了一本CPLEX手册,它似乎暗示IloException
没有继承std::exception
(一般来说,这不是一个好的做法)。所以我根据手册编辑了我的例子。
相关文章:
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- C++中"覆盖功能的异常规范比基本版本更宽松"的奇怪错误
- [longjmp/setjmp]c++ 相同的代码窗口有异常 Linux 没有错误并且运行良好
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 引发异常:读取访问冲突.**此**0x40错误
- 从 C# 调用 C++ DLib 会导致错误的分配异常
- 错误 : 异常 : 引发未处理的异常: 读取访问冲突.0xDDDDDDDD临时温度
- Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193
- C++执行期间的类成员函数错误/异常处理
- 无法捕获C++长度错误异常
- 内存读/写错误异常
- 字符串转换错误:异常还是错误代码
- 类中的错误/异常捕获
- 在库中引发逻辑错误异常或中止
- POCO C++SAX解析器:如果xml文档编码是ANSI,那么下一条语句不是读取并抛出编码错误异常
- 捕获 Segfault 或任何其他错误/异常/信号C++例如在 Java 中捕获异常