Yes, I did try trapping the error with eval but it didn't work - it still spews a bunch of errors. I haven't used eval before, so maybe I've messed something up; I'll try again.
But if the designers have decided that the archive-processing functions should be passed only valid ZIP files, then they should have also provided a function that lets the user test if a file is a valid ZIP file. For instance, the Archive::Extract package does have such a function, but I can't use that package for various reasons (it doesn't have a function for testing the presence of a file with a specified name in the archive and it requires the presence of an unarchiving program).