用户定义的非法异常
user defined illegal exception
我有这个程序,如果任何 2 边的总和大于 1,我应该 return 非法三角形异常。我应该把
放在哪里
if(side1 + side2 < side3)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side1 + side3 < side2)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side3 + side2 < side1)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
在这儿?我不确定把它放在哪里。另外我想知道我写代码的方式是否正确?
class Triangle
{
public double side1, side2, side3;
public Triangle() { }
public Triangle(double s1, double s2, double s3)
{
side1 = s1;
side2 = s2;
side3 = s3;
}
public double Side1
{
get { return side1; }
set {
if (value<0)
side1 = value;
}
}
public double Side2
{
get { return side2; }
set {
if (value < 0)
side2 = value;
}
}
public double Side3
{
get { return side3; }
set
{
if (value < 0)
side3 = value;
}
}
}
class IllegalTriangleException : Exception
{
public IllegalTriangleException() : base ("Sum of any 2 sides is not greater than the other") { }
public IllegalTriangleException(string msg) : base("Sum of any 2 sides is not greater than the other" + msg) { }
public IllegalTriangleException(string msg, Exception innerException) : base("Sum of any 2 sides is not greater than the other" + msg, innerException){ }
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Length of side: ");
double side1 = Convert.ToDouble(Console.ReadLine());
double side2 = Convert.ToDouble(Console.ReadLine());
double side3 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Your triangle is puuuuurfect");
}
catch (IllegalTriangleException ex)
{
Console.WriteLine(ex.Message);
}
}
}
这是我会做的:
通过将字段保持私有,您可以确保仅通过使用适当的属性才能为它们分配任何值。
请注意,构造函数将第一个和第二个值分配给字段,将第三个值分配给 属性 以检查非法三角形。
public class Triangle
{
private double _side1, _side2, _side3;
public Triangle() { }
public Triangle(double side1, double side2, double side3)
{
_side1 = side1;
_side2 = side2;
Side3 = side3; // Note: this is calling the property
}
public double Side1
{
get { return _side1; }
set {
if (value > 0)
{
CheckForIllegalTriangle(value, Side2, Side3);
_side1 = value;
}
}
}
public double Side2
{
get { return _side2; }
set {
if (value > 0)
{
CheckForIllegalTriangle(Side1, value, Side3);
_side2 = value;
}
}
}
public double Side3
{
get { return _side3; }
set
{
if (value > 0)
{
CheckForIllegalTriangle(Side1, Side2, value);
_side3 = value;
}
}
}
private void CheckForIllegalTriangle(double side1, double side2, double side3) {
if((side1 + side2 < side3) ||
(side1 + side3 < side2) ||
(side3 + side2 < side1))
{
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
}
}
首先。
- 属性是 public,内部字段应该是私有的。阅读本指南 https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx?f=255&MSPPError=-2147217396)
- 您应该首先使用 Triangle(double s1, double s2, double s3) 构造函数创建 Triangle 的实例。在该构造函数中,您可以调用私有 CheckForIllegalTriangle() 来检查边长。如果出现错误,这将抛出异常。
- 将默认构造函数设为私有。所以你不必担心调用 CheckForIllegalTriangle()。
class Triangle
{
private double side1, side2, side3;
private Triangle() { }
public Triangle(double s1, double s2, double s3)
{
side1 = s1;
side2 = s2;
side3 = s3;
CheckForIllegalTriangle();
}
public double Side1
{
get { return side1; }
set
{
if (value < 0)
side1 = value;
}
}
public double Side2
{
get { return side2; }
set
{
if (value < 0)
side2 = value;
}
}
public double Side3
{
get { return side3; }
set
{
if (value < 0)
side3 = value;
}
}
public void CheckForIllegalTriangle()
{
if ((side1 + side2 < side3) ||
(side1 + side3 < side2) ||
(side3 + side2 < side1))
throw new IllegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
}
class IllegalTriangleException : Exception
{
public IllegalTriangleException() : base("Sum of any 2 sides is not greater than the other") { }
public IllegalTriangleException(string msg) : base("Sum of any 2 sides is not greater than the other" + msg) { }
public IllegalTriangleException(string msg, Exception innerException) : base("Sum of any 2 sides is not greater than the other" + msg, innerException) { }
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Length of side 1: ");
double side1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Length of side 2: ");
double side2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Length of side 3: ");
double side3 = Convert.ToDouble(Console.ReadLine());
Triangle t1 = new Triangle(side1, side2, side3);
Console.WriteLine("Your triangle is puuuuurfect");
}
catch (IllegalTriangleException ex)
{
Console.WriteLine(ex.Message);
}
}
}
不可能每一边都大于另外两边,所以我认为你的问题是错误的。但这是我认为您正在努力实现的目标。
class Triangle
{
public double side1, side2, side3;
public Triangle() { }
public Triangle(double s1, double s2, double s3)
{
side1 = s1;
side2 = s2;
side3 = s3;
if(side1 + side2 < side3)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side1 + side3 < side2)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side3 + side2 < side1)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
public double Side1
{
get { return side1; }
set {
if (value>0)
side1 = value;
}
}
public double Side2
{
get { return side2; }
set {
if (value > 0)
side2 = value;
}
}
public double Side3
{
get { return side3; }
set
{
if (value > 0)
side3 = value;
}
}
}
class IllegalTriangleException : Exception
{
public IllegalTriangleException(string msg) : base(msg) { }
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Length of side: ");
double side1 = Convert.ToDouble(Console.ReadLine());
double side2 = Convert.ToDouble(Console.ReadLine());
double side3 = Convert.ToDouble(Console.ReadLine());
Triangle t = new Triangle(side1, side2, side3);
Console.WriteLine("Your triangle is puuuuurfect");
}
catch (IllegalTriangleException ex)
{
Console.WriteLine(ex.Message);
}
}
}
是具有不变量的可变三角形的良好实现。
但是,这里有一个很好的关于不变性的论据(即没有 setter),否则你最终会遇到从无效状态到有效状态之间转换的问题:
Triangle a(3, 4, 5);
Triangle b(30, 40, 50);
// let's adjust triangle a to match b
try {
a.Side1 = b.Side1; // nope
a.Side2 = b.Side2;
a.Side3 = b.Side3;
}
catch(IllegalTriangleException e) {
// darn, we accidentally went through an invalid state of (30, 4, 5)
}
不可变版本更容易实现
class ImmutableTriangle
{
public ImmutableTriangle(double side1, double side2, double side3)
{
if(side1 + side2 <= side3 ||
side2 + side3 <= side1 ||
side3 + side1 <= side2)
throw new IllegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
if(side1 <= 0 || side2 <= 0 || side3 <= 0)
throw new IllegalTriangleException("Sides must be positive");
}
Side1 = side1;
Side2 = side2;
Side3 = side3;
}
public double Side1 { get; private set; }
public double Side2 { get; private set; }
public double Side3 { get; private set; }
}
(请注意,我还将 <
换成了 <=
,并修复了负长度检查)
我有这个程序,如果任何 2 边的总和大于 1,我应该 return 非法三角形异常。我应该把
放在哪里if(side1 + side2 < side3)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side1 + side3 < side2)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side3 + side2 < side1)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
在这儿?我不确定把它放在哪里。另外我想知道我写代码的方式是否正确?
class Triangle
{
public double side1, side2, side3;
public Triangle() { }
public Triangle(double s1, double s2, double s3)
{
side1 = s1;
side2 = s2;
side3 = s3;
}
public double Side1
{
get { return side1; }
set {
if (value<0)
side1 = value;
}
}
public double Side2
{
get { return side2; }
set {
if (value < 0)
side2 = value;
}
}
public double Side3
{
get { return side3; }
set
{
if (value < 0)
side3 = value;
}
}
}
class IllegalTriangleException : Exception
{
public IllegalTriangleException() : base ("Sum of any 2 sides is not greater than the other") { }
public IllegalTriangleException(string msg) : base("Sum of any 2 sides is not greater than the other" + msg) { }
public IllegalTriangleException(string msg, Exception innerException) : base("Sum of any 2 sides is not greater than the other" + msg, innerException){ }
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Length of side: ");
double side1 = Convert.ToDouble(Console.ReadLine());
double side2 = Convert.ToDouble(Console.ReadLine());
double side3 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Your triangle is puuuuurfect");
}
catch (IllegalTriangleException ex)
{
Console.WriteLine(ex.Message);
}
}
}
这是我会做的:
通过将字段保持私有,您可以确保仅通过使用适当的属性才能为它们分配任何值。
请注意,构造函数将第一个和第二个值分配给字段,将第三个值分配给 属性 以检查非法三角形。
public class Triangle
{
private double _side1, _side2, _side3;
public Triangle() { }
public Triangle(double side1, double side2, double side3)
{
_side1 = side1;
_side2 = side2;
Side3 = side3; // Note: this is calling the property
}
public double Side1
{
get { return _side1; }
set {
if (value > 0)
{
CheckForIllegalTriangle(value, Side2, Side3);
_side1 = value;
}
}
}
public double Side2
{
get { return _side2; }
set {
if (value > 0)
{
CheckForIllegalTriangle(Side1, value, Side3);
_side2 = value;
}
}
}
public double Side3
{
get { return _side3; }
set
{
if (value > 0)
{
CheckForIllegalTriangle(Side1, Side2, value);
_side3 = value;
}
}
}
private void CheckForIllegalTriangle(double side1, double side2, double side3) {
if((side1 + side2 < side3) ||
(side1 + side3 < side2) ||
(side3 + side2 < side1))
{
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
}
}
首先。
- 属性是 public,内部字段应该是私有的。阅读本指南 https://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx?f=255&MSPPError=-2147217396)
- 您应该首先使用 Triangle(double s1, double s2, double s3) 构造函数创建 Triangle 的实例。在该构造函数中,您可以调用私有 CheckForIllegalTriangle() 来检查边长。如果出现错误,这将抛出异常。
- 将默认构造函数设为私有。所以你不必担心调用 CheckForIllegalTriangle()。
class Triangle
{
private double side1, side2, side3;
private Triangle() { }
public Triangle(double s1, double s2, double s3)
{
side1 = s1;
side2 = s2;
side3 = s3;
CheckForIllegalTriangle();
}
public double Side1
{
get { return side1; }
set
{
if (value < 0)
side1 = value;
}
}
public double Side2
{
get { return side2; }
set
{
if (value < 0)
side2 = value;
}
}
public double Side3
{
get { return side3; }
set
{
if (value < 0)
side3 = value;
}
}
public void CheckForIllegalTriangle()
{
if ((side1 + side2 < side3) ||
(side1 + side3 < side2) ||
(side3 + side2 < side1))
throw new IllegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
}
class IllegalTriangleException : Exception
{
public IllegalTriangleException() : base("Sum of any 2 sides is not greater than the other") { }
public IllegalTriangleException(string msg) : base("Sum of any 2 sides is not greater than the other" + msg) { }
public IllegalTriangleException(string msg, Exception innerException) : base("Sum of any 2 sides is not greater than the other" + msg, innerException) { }
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Length of side 1: ");
double side1 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Length of side 2: ");
double side2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Length of side 3: ");
double side3 = Convert.ToDouble(Console.ReadLine());
Triangle t1 = new Triangle(side1, side2, side3);
Console.WriteLine("Your triangle is puuuuurfect");
}
catch (IllegalTriangleException ex)
{
Console.WriteLine(ex.Message);
}
}
}
不可能每一边都大于另外两边,所以我认为你的问题是错误的。但这是我认为您正在努力实现的目标。
class Triangle
{
public double side1, side2, side3;
public Triangle() { }
public Triangle(double s1, double s2, double s3)
{
side1 = s1;
side2 = s2;
side3 = s3;
if(side1 + side2 < side3)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side1 + side3 < side2)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
if(side3 + side2 < side1)
throw new illegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
public double Side1
{
get { return side1; }
set {
if (value>0)
side1 = value;
}
}
public double Side2
{
get { return side2; }
set {
if (value > 0)
side2 = value;
}
}
public double Side3
{
get { return side3; }
set
{
if (value > 0)
side3 = value;
}
}
}
class IllegalTriangleException : Exception
{
public IllegalTriangleException(string msg) : base(msg) { }
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Length of side: ");
double side1 = Convert.ToDouble(Console.ReadLine());
double side2 = Convert.ToDouble(Console.ReadLine());
double side3 = Convert.ToDouble(Console.ReadLine());
Triangle t = new Triangle(side1, side2, side3);
Console.WriteLine("Your triangle is puuuuurfect");
}
catch (IllegalTriangleException ex)
{
Console.WriteLine(ex.Message);
}
}
}
但是,这里有一个很好的关于不变性的论据(即没有 setter),否则你最终会遇到从无效状态到有效状态之间转换的问题:
Triangle a(3, 4, 5);
Triangle b(30, 40, 50);
// let's adjust triangle a to match b
try {
a.Side1 = b.Side1; // nope
a.Side2 = b.Side2;
a.Side3 = b.Side3;
}
catch(IllegalTriangleException e) {
// darn, we accidentally went through an invalid state of (30, 4, 5)
}
不可变版本更容易实现
class ImmutableTriangle
{
public ImmutableTriangle(double side1, double side2, double side3)
{
if(side1 + side2 <= side3 ||
side2 + side3 <= side1 ||
side3 + side1 <= side2)
throw new IllegalTriangleException("Sum of any 2 sides not bigger than the other side");
}
if(side1 <= 0 || side2 <= 0 || side3 <= 0)
throw new IllegalTriangleException("Sides must be positive");
}
Side1 = side1;
Side2 = side2;
Side3 = side3;
}
public double Side1 { get; private set; }
public double Side2 { get; private set; }
public double Side3 { get; private set; }
}
(请注意,我还将 <
换成了 <=
,并修复了负长度检查)