C# 使用变量外部Try-Catch
我需要使用try块中初始化的变量的值。我有这个基本代码C# 使用变量外部Try-Catch,c#,C#,我需要使用try块中初始化的变量的值。我有这个基本代码 Customer customer = null; try { customer = new Customer(....); } catch (Exception){} string customerCode = customer.Code; 如果没有异常,则客户完全可用,但如果有异常,则客户未初始化,则返回null 我已经检查了customer在块内的初始化是否正确。在内部,即使在异常情况下也完全可用。但我需要它以后用 有什么办
Customer customer = null;
try
{
customer = new Customer(....);
}
catch (Exception){}
string customerCode = customer.Code;
如果没有异常,则客户完全可用,但如果有异常,则客户未初始化,则返回null
我已经检查了customer在块内的初始化是否正确。在内部,即使在异常情况下也完全可用。但我需要它以后用
有什么办法可以一直留住客户吗?:)
编辑:
正如你所想,这是伪代码。正如我所读到的,在构造函数中使用异常似乎是个坏主意。这是我的构造函数的真实代码的一部分
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")
}
}
但是我不能在'try'块之外断言DirectDebitRemitanceReject.ControlSum
所以。。。我是否尝试另一种方法(从构造函数内部删除异常)或是否有其他解决方法
谢谢!:)
(对不起,编辑太多了):(你的例子很好地说明了为什么要写作
catch (Exception){}
这是一种非常糟糕的做法
当你捕获一个异常时,你应该对它做些什么。如果你不知道如何处理代码中某个特定方法中的异常,不要在该方法中捕获异常
如果您总是需要客户,即使其检索导致异常,也可以向catch
块添加一些代码,以将customer
变量设置为某个默认对象:
try {
...
} catch (Exception) {
customer = Customer.Unknown;
}
这假设Customer
具有类型为Customer
的属性Unknown
,具有一些默认行为
注释:需要警告我的代码的上层。只是,当我创建一个实例时,创建它,但警告错误的参数。你能给我推荐一些更好的方法吗 创建工厂以在创建用户时验证用户:
class CustomerCreationResult {
public Customer Customer() { get; set; }
public CustomerCreationError Error() { get; set; }
}
class CustomerFactory {
public CustomerCreationResult CreateCustomer(String name, int age) { ... }
}
现在,您可以按如下方式创建客户:
var r = myCustomerFactory.CreateCustomer(name, age);
if (r.getError() != null) {
... // Present the error
}
Customer customer = r.Customer;
...
如果客户总是正确初始化,那么为什么在try块中有它 如果您想在异常发生时保持它,可以将customer的初始化移到try块之外,或者对较小的代码块使用try/catch 例如:
Customer customer = null;
try
{
//in this block do the stuff that is unlikely to cause exceptions
customer = new Customer(...);
try
{
//stuff that is likely to cause exceptions
}
catch(Exception e)
{
//handle likely errors
}
catch (Exception e)
{
//handle the unusual errors
}
我认为dasblinkenlight的答案很好,但就最简单的目的而言,一个
if
就足够了:
string customerCode = "";
if (customer!=null)
{
customerCode = customer.Code;
}
你真的应该检查异常…这意味着try没有执行该语句。变量在try块后不会丢失其值。你可能有异常。如果你发布实际代码,我们可能会提供帮助。从代码的外观判断(特别是因为构造函数不应该抛出异常)我假设它是伪代码。你可能想看看你在构造函数中做了什么。你的构造函数最好不要抛出异常。如果你总是需要客户,为什么不删除
try
-catch
?@JeppeStigNielsen为什么会有帮助?try/catch不能清除值。@dman2306 whycatch如果您真的需要客户的实例,请使用code>并吞下异常。全面捕获通常是个坏主意。如果客户总是正确初始化,那么为什么要在try块中使用它?为什么要进行异常处理?来处理异常。这一次它不起作用。如果您希望在异常发生时保持它curs…,这是不可能的。如果构造函数失败,你根本就没有实例。理论上,任何对new
的调用都可能会失败,出现OutOfMemoryException
,因此永远没有办法100%保证它总是正确初始化。通常,一旦遇到OOM异常,你就完成了,但关键是异常可能会发生在这一行,因此一个try
/catch
并不是100%愚蠢。好吧,这很公平。但根据他最初的帖子,客户总是正确地初始化。如果他的方法中有一部分更可能产生问题,那么需要以某种方式处理该部分,以便他的外部try块不会失败。@AdamP yes,as经验丰富的开发人员我们应该告诉他,他不能保证某些东西总是有效的,因为他正在处理的设备具有超出他控制范围的限制。记住,他是来学习的。如果他的陈述是真的,它总是正确初始化,那么它就永远不会为空,他也不会在这里。因此,他是不正确的。我不确定w这是什么意思或者它是如何解决问题的?我不记得他的问题提到了任何NullReferenceException
,他问为什么它为null。对不起,我使用了伪代码,但没有解释构造函数的真实行为。我编辑了我的示例并添加了它。我想使用exception来表示初始化过程中出现了参数错误不可恢复,即使构造函数解决了它。可能是异常并不是处理此问题的最佳方法。有什么建议吗?谢谢!@Kaikus异常应该用于不可恢复的情况。如果您想警告用户一个可恢复的错误,请使用不同的机制报告您的警告。需要警告我的代码的上层。Just、 当我创建一个实例时,请创建它,但要警告错误的参数。你能给我推荐一些更好的方法吗?谢谢!非常感谢!我将使用以下方法:)
string customerCode = "";
if (customer!=null)
{
customerCode = customer.Code;
}