পোস্টগ্রিসে আমরা এই কোডটি ব্যবহার করে ব্যতিক্রমগুলির "স্ট্যাক ট্রেস" পাই:
EXCEPTION WHEN others THEN
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
এটি "প্রাকৃতিক" ব্যতিক্রমগুলির জন্য সূক্ষ্মভাবে কাজ করে, তবে যদি আমরা ব্যবহার করে একটি ব্যতিক্রম উত্থাপন করি
RAISE EXCEPTION 'This is an error!';
... তাহলে কোনও স্ট্যাক ট্রেস নেই is একটি মেলিং তালিকার এন্ট্রি অনুসারে , এটি ইচ্ছাকৃত হতে পারে, যদিও আমি আমার জীবনের জন্য তা বুঝতে পারি না। এটি আমাকে ব্যবহার ব্যতীত কোনও ব্যতিক্রম ছুঁড়ে ফেলার অন্য কোনও উপায় বের করতে চায় RAISE
। আমি কি স্পষ্ট কিছু মিস করছি? কারও কি এর জন্য কৌশল আছে? Postgres এ ছুঁড়ে ফেলতে আমি কীভাবে ব্যতিক্রম পাব যাতে আমার পছন্দের একটি স্ট্রিং থাকে, যাতে আমি ত্রুটি বার্তায় আমার স্ট্রিংটিই পাই না, তবে পুরো স্ট্যাক ট্রেসটিও পাই?
এখানে একটি সম্পূর্ণ উদাহরণ:
CREATE OR REPLACE FUNCTION error_test() RETURNS json AS $$
DECLARE
v_error_stack text;
BEGIN
-- Comment this out to see how a "normal" exception will give you the stack trace
RAISE EXCEPTION 'This exception will not get a stack trace';
-- This will give a divide by zero error, complete with stack trace
SELECT 1/0;
-- In case of any exception, wrap it in error object and send it back as json
EXCEPTION WHEN others THEN
-- If the exception we're catching is one that Postgres threw,
-- like a divide by zero error, then this will get the full
-- stack trace of the place where the exception was thrown.
-- However, since we are catching an exception we raised manually
-- using RAISE EXCEPTION, there is no context/stack trace!
GET STACKED DIAGNOSTICS v_error_stack = PG_EXCEPTION_CONTEXT;
RAISE WARNING 'The stack trace of the error is: "%"', v_error_stack;
return to_json(v_error_stack);
END;
$$ LANGUAGE plpgsql;
error_info
? দেখতে কাস্টম টাইপের মতো।