<trycatch>

Executes a set of tasks, and optionally catches a build exception to allow recovery or rollback steps to be taken, or to define some steps to be taken regardless if the tasks succeed or fail, or both.

The tasks defined in the <> block will be executed in turn, as they normally would in a target.

If a <> block is defined, the tasks in that block will be executed in turn only if one of the tasks in the <> block fails. This failure will then be suppressed by the <> block.

The message associated with the failure can also be caught in a property for use within the <> block. The original contents of the property will be restored upon exiting the <> block.

If a <> block is defined, the tasks in that block will be executed after the tasks in both the <> and <> blocks have been executed, regardless of whether any task fails in either block.

Parameters

Attribute Type Description Required
failonerror bool
Determines if task failure stops the build, or is just reported. The default is true.
False
if bool
If true then the task will be executed; otherwise, skipped. The default is true.
False
unless bool
Opposite of NAnt.Core.Task.IfDefined. If false then the task will be executed; otherwise, skipped. The default is false.
False
verbose bool
Determines whether the task should report detailed build log messages. The default is false.
False

Nested elements

<catch>

The tasks in this block will be executed if any task in the try block fails.

</catch>

<finally>

The tasks in this block will always be executed, regardless of what happens in the try and catch blocks.

</finally>

<try>

The tasks in this block will be executed as a normal part of the build script.

</try>

Examples

    <trycatch>
    <try>
        <echo message="In try" />
        <fail message="Failing!" />
    </try>
    <catch>
        <echo message="In catch" />
    </catch>
    <finally>
        <echo message="Finally done" />
    </finally>
</trycatch>

The output of this example will be:

In try
In catch
Finally done

The failure in the <> block will not cause the build to fail.

    <trycatch>
    <try>
        <echo message="In try" />
        <fail message="Just because..." />
    </try>
    <catch property="failure">
        <echo message="Caught failure: ${failure}" />
        <fail message="Bad catch" />
    </catch>
    <finally>
        <echo message="Finally done" />
    </finally>
</trycatch>

The output of this example will be:

In try
Caught failure: Just because...
Finally done
Build failed: Bad catch

Like the above, the failure in the <> block does not cause the build to fail. The failure in the <> block does, however. Note that the <> block is executed even though the <> block failed.

    <trycatch>
    <try>
        <echo message="In try" />
        <fail message="yet again" />
    </try>
    <catch property="failure">
        <echo message="Caught failure ${failure}" />
        <fail message="Bad catch" />
    </catch>
    <finally>
        <echo message="Finally done ${failure}" />
    </finally>
</trycatch>

The output of this example will be:

In try
Caught failure yet again
Build failed: Property 'failure' has not been set.

The NAnt.Core.Tasks.EchoTask in the <> block failed because the "failure" property was not defined after exiting the <> block. Note that the failure in the <> block has eclipsed the failure in the <> block.

    <trycatch>
    <try>
        <property name="temp.file" value="${path::get-temp-file-name()}" />
        <do-stuff to="${temp.file}" />
        <fail message="Oops..." />
    </try>
    <finally>
        <echo message="Cleaning up..." />
        <if test="${property::exists('temp.file')}">
            <delete file="${temp.file}" />
        </if>
    </finally>
</trycatch>

A more concrete example, that will always clean up the generated temporary file after it has been created.

Requirements

Assembly
NAnt.Core.dll
Namespace
NAnt.Core.Tasks