如何查找对象的哪个属性引发了异常C#
本文关键字:属性 异常 何查找 查找 对象 | 更新日期: 2023-09-27 18:00:26
有没有办法找出对象的哪个属性引发了异常。我有一个有3个属性的类。我想给用户一个消息,说明类中的某个特定属性是错误的。
public class Numbers
{
public string Num1 { get; set; }
public string Num2 { get; set; }
public string Num3 { get; set; }
}
class Program
{
static void Main(string[] args)
{
var numbers = new Numbers() { Num1 = "22", Num2 = "err", Num3 = "33" };
// Call an extension method which tries convert to Int
var num = numbers.Num1.StringToInt();
num = numbers.Num2.StringToInt();
num = numbers.Num3.StringToInt();
Console.WriteLine(num);
Console.ReadLine();
}
}
public static class SampleExtension
{
static StackTrace stackTrace = new StackTrace(true);
// Extension method that converts string to Int
public static int StringToInt(this string number)
{
try
{
// Intentionally used 'Convert' instead of 'TryParse' to raise an exception
return Convert.ToInt32(number);
}
catch (Exception ex)
{
// Show a msg to the user that Numbers.Num2 is wrong. "Input string not in correct format"
var msg = stackTrace.GetFrame(1).GetMethod().ToString();
msg = ex.Message;
msg += ex.StackTrace;
throw;
}
}
}
我正在使用一个扩展方法将sting转换为int。我正在寻找一种方法来捕捉扩展方法本身中的错误属性。我正在使用.Net framework 4.0。请提出建议。
我会使用Int32.TryParse
,然后您可以显式处理解析失败。
public static int StringToInt(this string number)
{
try
{
int result;
if (!Int32.TryParse(number, out result))
{
// handle the parse failure
}
return result;
}
}
为什么不在调用期间简单地向方法提供所有需要的数据?示意性地(您可以扩展它):
public static int ToInt(string number, string info)
{
try
{
// ...
}
catch(Exception e)
{
MessageBox.Show(info);
}
}
// and usage
string str1 = "123";
int n = ToInt(str1, "Trying to parsing str1");
注意
我是基于.NET 4.5回答这个问题的,因为这个问题没有特定框架版本的标记。我把答案留在这里,因为它可能对将来使用.NET 4.5的访问者有用
我想说,您的代码示例非常难看,因为您可以通过使用int.TryParse
来克服这个问题,但我猜您想显示一个通用情况(错误的选择),并且只想知道扩展方法的调用方名称:检查.NET Framework 4.5版本中引入的[CallerMemeberNameAttribute]
:
- http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx
例如,在扩展或常规方法中,执行以下操作:
public void Method([CallerMemberName] string callerName)
{
}
CLR将使用调用方的名称设置输入参数!
public static int StringToInt(this Numbers number,
Expression<Func<Numbers, string>> prop)
{
try
{
return Convert.ToInt32(prop.Compile()(number));
}
catch (Exception ex)
{
var expression = (MemberExpression)prop.Body;
string name = expression.Member.Name;
throw new MissingMemberException(string.Format("Invalid member {0}", name));
}
}
并称之为:
var num = numbers.StringToInt(p=>p.Num1);