我想创建新的异常类型以通过指定日志记录来捕获它。但我想将int值传递给ctor。怎么做?我试试:
public class IncorrectTimeIdException : Exception
{
public IncorrectTimeIdException(int TypeID) : base(message)
{
}
}
但是我在编译期间出错了。
答案 0 :(得分:2)
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")
{
}
}
答案 1 :(得分:2)
以下是一些代码,您可以使用这些代码创建一个自定义异常类,其中包含一些附加数据(在您的情况下为类型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);
}
}
答案 2 :(得分:1)
该消息确切地告诉您问题所在 - 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")
{
}
如果你愿意,你也可以在你的类上声明多个构造函数,这样你就可以提供一个构造函数,它同时使用一个预定义的消息,提供一个允许你覆盖该消息的构造函数。