1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-10 22:31:40 +02:00

Added better error reporting for unclear crashes

This commit is contained in:
Ivan Savenko
2025-01-19 12:39:22 +00:00
parent 711bbc684f
commit 82b81a7853
4 changed files with 25 additions and 5 deletions

View File

@@ -182,6 +182,9 @@ void CPlayerInterface::closeAllDialogs()
if(infoWindow && infoWindow->ID != QueryID::NONE)
break;
if (topWindow == nullptr)
throw std::runtime_error("Invalid or non-existing top window! Total windows: " + std::to_string(GH.windows().count()));
topWindow->close();
}
}

View File

@@ -343,6 +343,9 @@ WindowBase::WindowBase(int used_, Point pos_)
void WindowBase::close()
{
if(!GH.windows().isTopWindow(this))
throw std::runtime_error("Only top interface can be closed");
{
auto topWindow = GH.windows().topWindow<IShowActivatable>().get();
throw std::runtime_error(std::string("Only top interface can be closed! Top window is ") + typeid(*this).name() + " but attempted to close " + typeid(*topWindow).name());
}
GH.windows().popWindows(1);
}

View File

@@ -212,10 +212,17 @@ void CAnimation::createFlippedGroup(const size_t sourceGroup, const size_t targe
ImageLocator CAnimation::getImageLocator(size_t frame, size_t group) const
{
const ImageLocator & locator = source.at(group).at(frame);
try
{
const ImageLocator & locator = source.at(group).at(frame);
if (!locator.empty())
return locator;
if (!locator.empty())
return locator;
}
catch (std::out_of_range &)
{
throw std::runtime_error("Frame " + std::to_string(frame) + " of group " + std::to_string(group) + " is missing from animation " + name.getOriginalName() );
}
return ImageLocator(name, frame, group);
}

View File

@@ -394,8 +394,15 @@ void CGTownInstance::initializeConfigurableBuildings(vstd::RNG & rand)
{
for(const auto & kvp : getTown()->buildings)
{
if(!kvp.second->rewardableObjectInfo.getParameters().isNull())
if(kvp.second->rewardableObjectInfo.getParameters().isNull())
continue;
try {
rewardableBuildings[kvp.first] = new TownRewardableBuildingInstance(this, kvp.second->bid, rand);
}
catch (std::runtime_error & e) {
throw std::runtime_error("Failed to load rewardable building data for " + kvp.second->getJsonKey() + " Reason: " + e.what());
}
}
}