Many failures arise from complex and imperfectly understood interactions of a computational system with aspects of the environment in which it operates. By environment we mean the computational system's broader context, also called the problem world. In this work, we propose a new analysis technique called failure frames, a variation of Jackson's problem frames, to identify and model classes of environmental assumptions whose violation is known from experience to have prevented the requirements from being satisfied. We use instances of failure frames, called failure diagrams, to make explicit in the requirements model the environmental assumptions that contributed to past failures. Developers want to reuse such knowledge of past failures to prevent failures in similar, new systems. We show that failure frames and failure diagrams can capture environmental assumptions that developers need to check in order to prevent recurrence of certain failures in similar application areas. The new failure frame approach that we describe arose from our work in molecular programming of DNA nanosystems. Inaccurate assumptions about the environment are a source of many failures in DNA nanosystems and can be extremely challenging to resolve. We describe the structure of a failure catalog for DNA nanosystems that we have prototyped for use by molecular programmers. We hypothesize that the failure frame approach and catalog can be broadly useful for reducing failure recurrence in other large, distributed applications with autonomous or nondeterministic behavior that must operate in uncertain environments.