Это не решение «наилучшей практики», но я думаю, что оно должно работать просто.
Вместо того, чтобы делегат был определен как
private delegate string SubmitFileDelegate(FileInfo file);
определить как
private delegate SubmitFileResult SubmitFileDelegate(FileInfo file);
и определите SubmitFileResult следующим образом:
public class SubmitFileResult
{
public string Result;
public Exception Exception;
}
Затем метод, который фактически выполняет отправку файла (не показан в вопросе), должен быть определен следующим образом:
private static SubmitFileResult Submit(FileInfo file)
{
try
{
var submissionResult = ComplexSubmitFileMethod();
return new SubmitFileResult { Result = submissionResult };
}
catch (Exception ex)
{
return new SubmitFileResult {Exception = ex, Result = "ERROR"};
}
}
Таким образом, вы исследуете объект результата, посмотрите, не установлен ли он в поле «Результат» или «Исключение», и будете действовать соответственно.