In addition to toolic's suggestion, I've seen Test::Exception used pretty extensively. For example, it's in the test suite for Moose and Mouse. I haven't worked with it extensively and it's not in CORE, so I don't know if it has any gotchas.
Comment on Re: Testing error handling that calls "die"