Мне нужно использовать значение переменной, инициализированной внутри блока try. У меня есть этот базовый кодИспользование переменной снаружи Try-Catch
Customer customer = null;
try
{
customer = new Customer(....);
}
catch (Exception){}
string customerCode = customer.Code;
Если не исключение, клиент perfecly можно использовать, но если есть исключение, клиент не инициализирован, он возвращает нуль
Я проверил, что клиент ВСЕГДА инициализирует правильно Вставить блок. ВНУТРИ Идеально подходит даже в случае исключения. Но мне это нужно для последующего использования.
Любой способ ВСЛЕДСТВИЕ сохранить клиента? :)
EDIT:
Как предполагается, это был псевдокод. Как я могу прочитать, похоже, что использование исключений в конструкторах - идея BAD. Это часть моего REAL-кода для моего конструктора.
public class DirectDebitRemmitanceReject
{
int numberOfTransactions;
decimal controlSum;
List<DirectDebitTransactionReject> directDebitTransactionRejects;
public DirectDebitRemmitanceReject(
int numberOfTransactions,
decimal controlSum,
List<DirectDebitTransactionReject> directDebitTransactionRejects)
{
this.numberOfTransactions = numberOfTransactions;
this.controlSum = controlSum;
this.directDebitTransactionRejects = directDebitTransactionRejects;
if (TheProvidedNumberOfTransactionsIsWrong()) ChangeNumberOfTransactionsAndRiseException();
if (TheProvidedControlSumIsWrong()) ChangeControlSumAndRiseException();
}
private bool TheProvidedNumberOfTransactionsIsWrong()
{
return (numberOfTransactions != directDebitTransactionRejects.Count)
}
private bool TheProvidedControlSumIsWrong()
{
return (controlSum !=directDebitTransactionRejects.Select(ddRemmitanceReject => ddRemmitanceReject.Amount).Sum();)
}
private void ChangeNumberOfTransactionsAndRiseException()
{
......
......
throw new ArgumentException(exceptionMessage, "numberOfTransactions")
private void ChangeControlSumAndRiseException()
{
......
......
throw new ArgumentException(exceptionMessage, "controlSum")
}
}
В методах "TheProvided ... Я проверить, если аргументы совпадают с суммой значений в списке. Если нет, я обновляю их и сообщаю, создавая ArgumentException
Дело в том, что я хотел, чтобы конструктор ALLWAYS возвращал действительный (конгруэнтный) DirectDebitRemmitanceReject, но желал, чтобы тот же самый конструктор поднял исключение, если был указан неправильный номерOfTransactions или controlSum. NumberOfTransactions и controlSum не следует изменять позже, только читать.
В моих тестах, это хорошо работает
[TestMethod]
[ExpectedException(typeof(System.ArgumentException))]
public void IfTheProvidedControlSumInARemmitanceRejectIsWorgAnExceptionIsThrown()
{
try
{
DirectDebitRemmitanceReject directDebitRemmitanceReject = new DirectDebitRemmitanceReject(
originalDirectDebitRemmitance1MessageID,
2,
100,
directDebitTransactionRejectsList1);
}
catch (System.ArgumentException e)
{
Assert.AreEqual("controlSum", e.ParamName);
Assert.AreEqual("The Control Sum is wrong. Provided: 100. Expected: 150. Initialized with expected value", e.GetMessageWithoutParamName());
throw;
}
}
[TestMethod]
public void IfTheProvidedControlSumInARemmitanceRejectIsWorgItIsCorrected()
{
try
{
DirectDebitRemmitanceReject directDebitRemmitanceReject = new DirectDebitRemmitanceReject(
originalDirectDebitRemmitance1MessageID,
2,
100,
directDebitTransactionRejectsList1);
Assert.AreEqual(150, directDebitRemmitanceReject.ControlSum);
}
catch (ArgumentException) { }
}
Но я могу, т утверждающего directDebitRemmitanceReject.ControlSum вне блока «попробовать»
Итак ... я попробовать другой ПОДХОД (удалить исключение изнутри конструктора) или есть другое обходное решение?
Спасибо! :)
(Извините за ЭКСТЕНСИВНОГО редактирования) :(
Это означает, что попытка не выполнила это утверждение. Переменные не теряют свое значение после блока try. Вероятно, у вас было исключение. Если вы разместите свой фактический код, мы, вероятно, сможем помочь. Судя по внешнему виду этого кода (тем более, что конструктор не должен генерировать исключение), я предполагаю, что это псевдокод. – dman2306
Возможно, вы захотите посмотреть, что вы делаете в своем конструкторе. В идеале ваш конструктор не должен исключать исключение. –
Если вам всегда нужен клиент, почему бы не отказаться от 'try'-'catch'? –