К сожалению, ответ, предоставленный @RuiDC, не работает в версиях MySQL до 5.5, потому что не существует реализации SIGNAL для хранимых процедур.
Решение, которое я обнаружено, что представляет собой симуляцию сигнала, выдающего ошибку table_name doesn't exist
, нажатие персонализированного сообщения об ошибке в table_name
.
Хак может быть реализован с помощью триггеров или с использованием хранимой процедуры , Я описываю оба варианта ниже, следуя примеру, используемому @RuiDC.
DELIMITER $$
-- before inserting new id
DROP TRIGGER IF EXISTS before_insert_id$$
CREATE TRIGGER before_insert_id
BEFORE INSERT ON test FOR EACH ROW
BEGIN
-- condition to check
IF NEW.id < 0 THEN
-- hack to solve absence of SIGNAL/prepared statements in triggers
UPDATE `Error: invalid_id_test` SET x=1;
END IF;
END$$
DELIMITER ;
Хранимые процедуры позволяют использовать динамические sql, что делает возможным инкапсуляцию функции генерации ошибок в одну процедуру. Противоположность заключается в том, что мы должны контролировать методы вставки / обновления приложений, поэтому они используют только нашу хранимую процедуру (не предоставляя прямые привилегии INSERT / UPDATE).
DELIMITER $$
-- my_signal procedure
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255))
BEGIN
SET @sql=CONCAT('UPDATE `', in_errortext, '` SET x=1');
PREPARE my_signal_stmt FROM @sql;
EXECUTE my_signal_stmt;
DEALLOCATE PREPARE my_signal_stmt;
END$$
CREATE PROCEDURE insert_test(p_id INT)
BEGIN
IF NEW.id < 0 THEN
CALL my_signal('Error: invalid_id_test; Id must be a positive integer');
ELSE
INSERT INTO test (id) VALUES (p_id);
END IF;
END$$
DELIMITER ;
Из перегружаемых операторов могут быть перегружены следующие операторы:
+, -, !, ~, ++, --, true, false
+, -, *, /, %, &, |, ^, <<, >>
==, !=, <, >, <=, >=
И эти операторы не могут быть перегружены:
&&, ||
[]
(T)x
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
=, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof
Кроме того, операторы сравнения должны быть перегружены попарно Если вы перегружаете одну, вы должны перегрузить другую:
==
и !=
<
и >
<=
и >=
Прямой ответ: нет, is
нельзя переопределить (потому что это ключевое слово).
Но вы можете сделать что-то более элегантное, используя дженерики. Сначала определите ваш метод Is()
следующим образом:
public bool Is<T>() where T: Exception
{
return typeof(T).FullName == this.TypeName;
}
Затем вы можете написать свое сравнение следующим образом:
if (ex.Is<Validator.ValidatorException>())
is
- это не перегруженное ключевое слово, но вы можете написать метод расширений следующим образом:
public static bool Is<T>(this Object source) where T : class
{
return source is T;
}