创建新的异常类型
本文关键字:类型 异常 创建 | 更新日期: 2023-09-27 18:25:06
我想创建新的异常类型,用指定日志记录来捕获它。但我想把int值传递给ctor。怎么做?我尝试:
public class IncorrectTimeIdException : Exception
{
public IncorrectTimeIdException(int TypeID) : base(message)
{
}
}
但我在编译过程中出错了。
public class IncorrectTimeIdException : Exception
{
private void DemonstrateException()
{
// The Exception class has three constructors:
var ex1 = new Exception();
var ex2 = new Exception("Some string"); // <--
var ex3 = new Exception("Some string and InnerException", new Exception());
// You're using the constructor with the string parameter, hence you must give it a string.
}
public IncorrectTimeIdException(int TypeID) : base("Something wrong")
{
}
}
以下是一些代码,您可以用来创建一个自定义异常类,该类携带一些额外的数据(在您的情况下是类型ID),并遵循创建自定义异常的所有"规则"。您可以根据自己的喜好重命名异常类和非描述性的自定义数据字段。
using System;
using System.Runtime.Serialization;
[Serializable]
public class CustomException : Exception {
readonly Int32 data;
public CustomException() { }
public CustomException(Int32 data) : base(FormatMessage(data)) {
this.data = data;
}
public CustomException(String message) : base(message) { }
public CustomException(Int32 data, Exception inner)
: base(FormatMessage(data), inner) {
this.data = data;
}
public CustomException(String message, Exception inner) : base(message, inner) { }
protected CustomException(SerializationInfo info, StreamingContext context)
: base(info, context) {
if (info == null)
throw new ArgumentNullException("info");
this.data = info.GetInt32("data");
}
public override void GetObjectData(SerializationInfo info,
StreamingContext context) {
if (info == null)
throw new ArgumentNullException("info");
info.AddValue("data", this.data);
base.GetObjectData(info, context);
}
public Int32 Data { get { return this.data; } }
static String FormatMessage(Int32 data) {
return String.Format("Custom exception with data {0}.", data);
}
}
消息告诉您问题的具体内容-未定义message
。
请尝试这个方法,它允许您在创建异常时提供用户消息:
public IncorrectTimeIdException(string message, int TypeID) : base(message)
{
}
// Usage:
throw new IncorrectTimeIdException("The time ID is incorrect", id);
或者,这会创建一个没有消息的异常:
public IncorrectTimeIdException(int TypeID)
{
}
或者最后,这会创建一个带有预定义消息的异常:
public IncorrectTimeIdException(int TypeID) : base("The time ID is incorrect")
{
}
如果您愿意,还可以在类上声明多个构造函数,这样您就可以提供一个使用预定义消息的构造函数,同时提供一个允许重写该消息的构造函数。